繁体   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