簡體   English   中英

導入子模塊的Python錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM