导入子模块的Python错误

时间:2015-05-10 18:09:44

标签: python

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。

2 个答案:

答案 0 :(得分:3)

在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

但这不是一个好主意。

答案 1 :(得分:0)

你有没有运行过setup.py或者#34;构建"你的图书馆?

我会创建一个setup.py文件,并可能在开发模式下运行它。 Python setup.py develop vs install