最近在寫程式時,由於需要接口 api,將網路上接收的資料傳回 main.py,進行後續一系列行為
試過後發現好像不行,以下是我簡化後的程式
a.py
import b
def receive(x):
global ans_a
ans_a = x
def p():
print(ans_a)
if __name__ == '__main__':
receive(23)
b.pp()
b.py
import a
def pp():
a.p()
執行 a.py 後,出現錯誤:NameError: name 'ans_a' is not defined
這個時候,我以為 python 的設計就是不能相互 import
直到我打算全面修改程式後,發現我寫的某個部分居然能夠執行,簡化後為下:
a.py
import b
import c
if __name__ == '__main__':
c.receive(23)
b.pp()
b.py
import c
def pp():
c.p()
c.py
def receive(x):
global ans_c
ans_c = x
def p():
print(ans_c)
執行 a.py 後,確實 print 出 23
見鬼了,為什麼下面可以上面不行??
後來經過了一番修改後(import 自己),終於可以執行了
a.py
import a
import b
def receive(x):
global ans_a
ans_a = x
def p():
print(ans_a)
if __name__ == '__main__':
a.receive(23)
b.pp()
b.py
import a
def pp():
a.p()
執行 a.py 後,確實 print 出 23
這個時候,我突然冒出一個想法, a.py 在執行的時候,是不是名稱不是 a
依據這個想法,到網路上爬文後,原來任何程式在執行的時候,名字都是 __main__
以下是最終的版本:
a.py
import b
def receive(x):
global ans_a
ans_a = x
def p():
print(ans_a)
if __name__ == '__main__':
receive(23)
b.pp()
b.py
import __main__
def pp():
__main__.p()
結論
如果執行檔的名稱為 xxx.py,在其他模塊要將資料回傳執行檔,或是執行執行檔的程式,並不是 import xxx,而是 import __main__