iT邦幫忙

0

(Python) 想要 import 自己可以嗎?其實蠻簡單的……

  • 分享至 

  • xImage
  •  

最近在寫程式時,由於需要接口 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__


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言