teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2021/02/09 23:46

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -18,4 +18,25 @@
18
18
 
19
19
  としてインポートすることができるということです。
20
20
 
21
- 循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
21
+ ~~循環参照にならないように気をつけなければいけない~~循環参照を意識する必要があることと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
22
+
23
+ ----
24
+
25
+ 意図的に循環参照したコードの例
26
+
27
+ a.py
28
+ ```python
29
+ import b
30
+
31
+ def x():
32
+ return 0
33
+ ```
34
+
35
+ b.py
36
+ ```python
37
+ import __main__
38
+
39
+ # この時点でxは未定義なのでエラーになる
40
+ # __main__に含まれる関数を探してもそこにxはない
41
+ print(__main__.x())
42
+ ```

3

蛇足な気がしたので消しました

2021/02/09 23:46

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  [https://docs.python.org/ja/3/library/__main__.html#module-__main__](https://docs.python.org/ja/3/library/__main__.html#module-__main__)
9
9
 
10
10
  ----
11
- 追記1
11
+ 追記
12
12
 
13
13
  したがってそれ以外のモジュールからは常に
14
14
 
@@ -18,29 +18,4 @@
18
18
 
19
19
  としてインポートすることができるということです。
20
20
 
21
- 循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
21
+ 循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
22
-
23
- ----
24
- 追記2
25
-
26
- a.py
27
- ```python
28
- import b
29
- ```
30
-
31
- b.py
32
- ```python
33
- import a
34
-
35
- import __main__
36
-
37
- print(a)
38
- print(__main__)
39
-
40
- print(a.__file__)
41
- print(__main__.__file__)
42
- ```
43
-
44
- と書いて`a.py`を実行した時、b.pyで`import __main__`で名前`__main__`に束縛されるモジュールと`import a`で名前`a`に束縛されるモジュールは、**別のモジュール**ですが**同じa.py**です。
45
- 注意してください。
46
- (このあたりもあって質問の"実行ファイルのモジュールを取得する"は意味が曖昧です)

2

コード追加

2021/02/08 03:21

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -30,8 +30,15 @@
30
30
 
31
31
  b.py
32
32
  ```python
33
+ import a
34
+
33
35
  import __main__
36
+
34
- import a
37
+ print(a)
38
+ print(__main__)
39
+
40
+ print(a.__file__)
41
+ print(__main__.__file__)
35
42
  ```
36
43
 
37
44
  と書いて`a.py`を実行した時、b.pyで`import __main__`で名前`__main__`に束縛されるモジュールと`import a`で名前`a`に束縛されるモジュールは、**別のモジュール**ですが**同じa.py**です。

1

追記

2021/02/08 03:05

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -5,4 +5,35 @@
5
5
 
6
6
  というイディオムを知っていれば分かっているはずですが、実行ファイルのモジュールは常に名前が`__main__`です。
7
7
 
8
- [https://docs.python.org/ja/3/library/__main__.html#module-__main__](https://docs.python.org/ja/3/library/__main__.html#module-__main__)
8
+ [https://docs.python.org/ja/3/library/__main__.html#module-__main__](https://docs.python.org/ja/3/library/__main__.html#module-__main__)
9
+
10
+ ----
11
+ 追記1
12
+
13
+ したがってそれ以外のモジュールからは常に
14
+
15
+ ```python
16
+ import __main__
17
+ ```
18
+
19
+ としてインポートすることができるということです。
20
+
21
+ 循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
22
+
23
+ ----
24
+ 追記2
25
+
26
+ a.py
27
+ ```python
28
+ import b
29
+ ```
30
+
31
+ b.py
32
+ ```python
33
+ import __main__
34
+ import a
35
+ ```
36
+
37
+ と書いて`a.py`を実行した時、b.pyで`import __main__`で名前`__main__`に束縛されるモジュールと`import a`で名前`a`に束縛されるモジュールは、**別のモジュール**ですが**同じa.py**です。
38
+ 注意してください。
39
+ (このあたりもあって質問の"実行ファイルのモジュールを取得する"は意味が曖昧です)