我是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
。
答案 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
。