回答編集履歴

4

些細

2022/07/14 06:23

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -22,11 +22,11 @@
22
22
  ```
23
23
  というコードをイディオムとして覚えてしまっているのかもしれませんが、ここでチェックしているのは上記の動作です。
24
24
  `pyhton Main_GUI.py`と実行された時は自身のモジュールの名前は`__main__`になっています。
25
- Pythonコード中で`import Main_GUI`と実行された時は自身のモジュールの名前は`Main_GUI`になっています。
25
+ Pythonコード中で`import Main_GUI`と実行されてロードされた時は自身のモジュールの名前は`Main_GUI`になっています。
26
26
  それをif文でチェックしているのです。
27
27
 
28
28
  **だから**`pyhton Main_GUI.py`と実行された時、main_1が実行され、window.initUIが実行され、その中でグローバル変数ggが作られるのです。
29
- そのグローバル変数ggを他からインポートするには
29
+ そのグローバル変数ggを他からインポートするには
30
30
  ```python
31
31
  from __main__ import gg
32
32
  ```

3

説明

2022/07/14 00:56

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -7,4 +7,58 @@
7
7
  ```
8
8
  from __main__ import gg
9
9
  ```
10
+
11
+
12
+ ----
13
+ 追記
14
+
15
+ ```
16
+ pyhton Main_GUI.py
17
+ ```
10
- https://docs.python.org/ja/3.9/library/__main__.html
18
+ として実行した場合、Main_GUI.py がロードされてできたモジュールには、 `Main_GUI` という名前ではなく、`__main__`という名前が付けられています。 > https://docs.python.org/ja/3.9/library/__main__.html
19
+
20
+ ```python
21
+ if __name__ == '__main__':
22
+ ```
23
+ というコードをイディオムとして覚えてしまっているのかもしれませんが、ここでチェックしているのは上記の動作です。
24
+ `pyhton Main_GUI.py`と実行された時は自身のモジュールの名前は`__main__`になっています。
25
+ Pythonコード中で`import Main_GUI`と実行された時は自身のモジュールの名前は`Main_GUI`になっています。
26
+ それをif文でチェックしているのです。
27
+
28
+ **だから**`pyhton Main_GUI.py`と実行された時、main_1が実行され、window.initUIが実行され、その中でグローバル変数ggが作られるのです。
29
+ そのグローバル変数ggがを他からインポートするには
30
+ ```python
31
+ from __main__ import gg
32
+ ```
33
+ とする必要があります。
34
+
35
+ Pythonコマンドの引数に指定した実行ファイルを、他の場所で
36
+ ```python
37
+ from Main_GUI import gg
38
+ ```
39
+ のようにファイル名でインポートしてしまうと、`__main__`としてロードされているものとは**別の**(Main_GUIという名前の)モジュールができてしまいます。
40
+ そこにはggというグローバル変数は**ない**のでエラーになります。
41
+
42
+ ----
43
+
44
+ import 文はそれが実行された場所の名前空間に名前を束縛します。
45
+ 関数実行中、関数内でimport文を書いたら、その文が作る変数はローカル変数になります。
46
+
47
+ グローバルなところで
48
+
49
+ ```Main_GUI.py
50
+ import sub
51
+ ```
52
+
53
+ ```sub.py
54
+ from __main__ import gg
55
+ ```
56
+ と書くと循環インポートになります。今回のケースはこれはうまくいきません。
57
+ 関数内部でローカルインポートするのが、うまく動かす方法です。その点では、もとのコードのインポート位置はよいと思います。(ggが`__init__`の中のローカル変数になっていますが、それが質問者さんの意図通りなのかは推し量ることは出来ませんが)
58
+
59
+
60
+ 一般にはグローバルな箇所での循環インポートは、動くかどうかがインポートする順番に左右されることが多いので、パッケージ-サブパッケージ間の循環インポート以外には書くべきではないです。
61
+
62
+ ----
63
+
64
+ これはこれとしてy_waiwai さんの解答の方が正答です。

2

編集

2022/07/12 04:06

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -1,7 +1,10 @@
1
1
  意図しているのは多分こう。
2
2
  ```
3
+ sys.path.append("Main_GUI ")
3
4
  from Main_GUI import gg
5
+ ```
4
6
 
7
+ ```
5
8
  from __main__ import gg
6
9
  ```
7
10
  https://docs.python.org/ja/3.9/library/__main__.html

1

途中

2022/07/12 03:20

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -4,4 +4,4 @@
4
4
 
5
5
  from __main__ import gg
6
6
  ```
7
- https://docs.python.org/ja/3.9/library/__main__.html?hi
7
+ https://docs.python.org/ja/3.9/library/__main__.html