模块已导入,但仍呈现NameError

时间:2019-12-29 12:04:02

标签: python-3.x

我是python包的新手,我正在学习如何将代码组织到包中。 我试用了一个用于测试目的的小程序,并对自己遇到的错误感到好奇。

我放置了以下程序包结构(我目前仅在regular packages上工作,因为我对namespace packages并不了解)

parent/
    main.py
    p1/
        __init__.py

p1/__init__.py中的代码如下:

import math
print('p1 imported.')

main.py中的代码如下:

from p1 import math

def main():
    print(p1)

if __name__=='__main__':
    main()

它给我的输出如下:

path-to-parent>python3 main.py
p1 imported
Traceback (most recent call last):
  File "main.py", line 12, in <module>
    main()
  File "main.py", line 8, in main
    print(p1)
NameError: name 'p1' is not defined

我了解它已经从sys.modules导入了数学,或者在遇到import math中的p1/__init__.py语句之后必须执行的后续完整搜索。它还执行了随后的语句print('p1 imported'),该语句指示模块p1已被导入。那么为什么NameError弹出呢?

通过阅读this page,我的猜测是,尽管模块p1已被导入,但由于其导入方式尚未经过绑定过程:from p1 import math

我仍然需要帮助来了解这一点。

  

注意:我正在Windows 10(64位)上使用Anaconda Python 3.7.3

2 个答案:

答案 0 :(得分:1)

from p1 import math

def main():
    print(p1)

if __name__=='__main__':
    main()

p1这是目录的名称,它不是可以使用的python变量。

这与以下尝试非常相似:

with open('filename') as f:
    print(filename)

显然会提高NameError,因为filename没有定义。

也许是一个更好的例子:

from math import pi

print(math)

这也会引发NameError,因为从未将math定义为可以在import机制之外使用的变量。 math是导入pi的模块的名称,但是只能通过导入机制看到。

答案 1 :(得分:0)

更容易证明您的工作失败的原因:

>>> from math import sin
>>> sin
<built-in function sin>
>>> math
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined

重点是,math.sin被导入为sin,但是为此所需的math模块未存储在任何地方以供参考。因此,没有可引用的本地math对象。

如果您想整体引用math模块,只需将其整体导入即可。例如,import p1