回答編集履歴

4

追記

2021/02/09 23:46

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -38,4 +38,46 @@
38
38
 
39
39
 
40
40
 
41
- 循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
41
+ ~~循環参照にならないように気をつけなければいけない~~循環参照を意識する必要があることと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
42
+
43
+
44
+
45
+ ----
46
+
47
+
48
+
49
+ 意図的に循環参照したコードの例
50
+
51
+
52
+
53
+ a.py
54
+
55
+ ```python
56
+
57
+ import b
58
+
59
+
60
+
61
+ def x():
62
+
63
+ return 0
64
+
65
+ ```
66
+
67
+
68
+
69
+ b.py
70
+
71
+ ```python
72
+
73
+ import __main__
74
+
75
+
76
+
77
+ # この時点でxは未定義なのでエラーになる
78
+
79
+ # __main__に含まれる関数を探してもそこにxはない
80
+
81
+ print(__main__.x())
82
+
83
+ ```

3

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

2021/02/09 23:46

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ----
20
20
 
21
- 追記1
21
+ 追記
22
22
 
23
23
 
24
24
 
@@ -39,53 +39,3 @@
39
39
 
40
40
 
41
41
  循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
42
-
43
-
44
-
45
- ----
46
-
47
- 追記2
48
-
49
-
50
-
51
- a.py
52
-
53
- ```python
54
-
55
- import b
56
-
57
- ```
58
-
59
-
60
-
61
- b.py
62
-
63
- ```python
64
-
65
- import a
66
-
67
-
68
-
69
- import __main__
70
-
71
-
72
-
73
- print(a)
74
-
75
- print(__main__)
76
-
77
-
78
-
79
- print(a.__file__)
80
-
81
- print(__main__.__file__)
82
-
83
- ```
84
-
85
-
86
-
87
- と書いて`a.py`を実行した時、b.pyで`import __main__`で名前`__main__`に束縛されるモジュールと`import a`で名前`a`に束縛されるモジュールは、**別のモジュール**ですが**同じa.py**です。
88
-
89
- 注意してください。
90
-
91
- (このあたりもあって質問の"実行ファイルのモジュールを取得する"は意味が曖昧です)

2

コード追加

2021/02/08 03:21

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -62,9 +62,23 @@
62
62
 
63
63
  ```python
64
64
 
65
+ import a
66
+
67
+
68
+
65
69
  import __main__
66
70
 
71
+
72
+
67
- import a
73
+ print(a)
74
+
75
+ print(__main__)
76
+
77
+
78
+
79
+ print(a.__file__)
80
+
81
+ print(__main__.__file__)
68
82
 
69
83
  ```
70
84
 

1

追記

2021/02/08 03:05

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -13,3 +13,65 @@
13
13
 
14
14
 
15
15
  [https://docs.python.org/ja/3/library/__main__.html#module-__main__](https://docs.python.org/ja/3/library/__main__.html#module-__main__)
16
+
17
+
18
+
19
+ ----
20
+
21
+ 追記1
22
+
23
+
24
+
25
+ したがってそれ以外のモジュールからは常に
26
+
27
+
28
+
29
+ ```python
30
+
31
+ import __main__
32
+
33
+ ```
34
+
35
+
36
+
37
+ としてインポートすることができるということです。
38
+
39
+
40
+
41
+ 循環参照にならないように気をつけなければいけないことと、対話環境などでは`__main__`は見つからずにエラーになることなどが注意点です。
42
+
43
+
44
+
45
+ ----
46
+
47
+ 追記2
48
+
49
+
50
+
51
+ a.py
52
+
53
+ ```python
54
+
55
+ import b
56
+
57
+ ```
58
+
59
+
60
+
61
+ b.py
62
+
63
+ ```python
64
+
65
+ import __main__
66
+
67
+ import a
68
+
69
+ ```
70
+
71
+
72
+
73
+ と書いて`a.py`を実行した時、b.pyで`import __main__`で名前`__main__`に束縛されるモジュールと`import a`で名前`a`に束縛されるモジュールは、**別のモジュール**ですが**同じa.py**です。
74
+
75
+ 注意してください。
76
+
77
+ (このあたりもあって質問の"実行ファイルのモジュールを取得する"は意味が曖昧です)