[英]Python error importing a child module
parent/__init__.py
:
favorite_numbers = [1]
def my_favorite_numbers():
for num in favorite_numbers:
num
my_favorite_numbers()
from .child import *
my_favorite_numbers()
parent/child.py
:
print favorite_numbers
favorite_numbers.append(7)
然后,我從名為tst.py
父目錄創建了一個目錄:
import parent
所以目錄結構如下所示:
parent (directory)
__init__.py (file)
child.py (file)
tst.py (file)
我在執行時遇到此錯誤:
NameError: name 'favorite_numbers' is not defined
如何在child.py中的favorite_numbers中添加一個值,這樣當我執行my_favorite_numbers()函數時,我得到1和7。
在Python中,每個模塊都有自己獨立的全局變量。 這實際上是模塊的重點(與C預處理器風格的文本插入相反)。
當你from .child import *
那里導入.child
,然后將它的所有全局變量復制到當前模塊的全局變量中。 它們仍然是獨立的模塊,具有自己的全局變量。
如果要在不同模塊中的代碼之間傳遞值,可能需要將該代碼包裝在函數中,然后將值作為函數參數傳遞並返回值。 例如:
parent/__init__.py
:
from .child import *
favorite_numbers = [1]
def my_favorite_numbers():
for num in favorite_numbers:
num
my_favorite_numbers()
child_stuff(favorite_numbers)
my_favorite_numbers()
parent/child.py
:
def child_stuff(favorite_numbers):
print favorite_numbers
favorite_numbers.append(7)
實際上,除了初始化(定義函數和類,創建常量和其他單例等)之外,您幾乎總是想要包含任何代碼。 import
模塊(包括from … import
)時,它僅在第一次運行其頂級代碼時。 如果再次import
,模塊對象已經存在於內存中(在sys.modules
),因此Python將使用它,而不是運行代碼再次構建它。
如果你真的想將值推送到另一個模塊的命名空間,你可以,但你必須明確地這樣做。 這意味着你必須通過導入模塊對象來獲得它,而不僅僅是從它導入:
from . import child
child.favorite_numbers = favorite_numbers
但這不是一個好主意。
你有沒有運行setup.py或“建立”你的圖書館的方式?
我會創建一個setup.py文件,並可能在開發模式下運行它。 Python setup.py develop vs install
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.