我在我的一个项目中做了一个相当做作的导入方案,我想我可能在Python解释器中发现了一个bug,它导致模块被导入两次。在
我的测试项目是如何设置的:
/
发射器.bat-项目从这里运行。它使用python3.2可执行文件启动“main/\uuinit_u.py”
main/\uu init_uy.py-由'发射器.bat'
main/食品-包含空类
external/\uu init_u.py—一个“main”项目脚本外部的脚本,用于演示问题
/发射器.bat
@echo off
C:\Python32\python.exe main\__init__.py
pause
/main/\uuu init_u.py
^{pr2}$/main/食品
class Foo:
pass
/external/\uuu init_u.py
from main.foo import Foo
print("In 'external', Foo has id:", id(Foo))
所有这些操作将打印两次'Main script was imported'
消息。如果外部脚本导入任何其他脚本,这些脚本也将被导入两次。我只在python3.2上测试过这个。这是虫子,还是我弄错了?在
程序输出为:
In 'main', Foo has id: 12955136
In 'main', Foo has id: 12955136
In 'external', Foo has id: 12957456
Press any key to continue . . .
我不认为这是个虫子。您应该在
python-dev
列表中询问以获得更权威的答案。执行一次(运行脚本时)和导入一次(从外部),这样就可以打印两次行。不是两次进口。在然而,这是一个可怕的设置。这里有很多违反风格的行为。尽管有些只是为了演示,但还是相当混乱。在
__init__.py
文件作为应该运行的文件。主入口点应该是导入包的脚本。在第一个
print
具有误导性:由于您不是导入,而是在第一次执行文件(__name__ == '__main__'
为真),所以主模块只导入一次。将起点移到辅助文件中,或检查__name__ == '__main__'
。在顺便说一下,circularimport是个坏主意。您应该解决循环导入(通过将foo移动到专用库)。或者,您可以使模块可重入(即在添加之前检查当前目录是否在
sys.path
中)。在相关问题 更多 >
编程相关推荐