模块导入两次。Python interp中可能的bug

2024-03-29 09:40:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在我的一个项目中做了一个相当做作的导入方案,我想我可能在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 . . .


Tags: 项目inpy脚本id食品fooinit
2条回答

我不认为这是个虫子。您应该在python-dev列表中询问以获得更权威的答案。执行一次(运行脚本时)和导入一次(从外部),这样就可以打印两次行。不是两次进口。在

然而,这是一个可怕的设置。这里有很多违反风格的行为。尽管有些只是为了演示,但还是相当混乱。在

  1. 您不应该使用包__init__.py文件作为应该运行的文件。主入口点应该是导入包的脚本。在
  2. 您不应该让导入的模块导入导入它的模块。就像你外边做的一样。在

第一个print具有误导性:由于您不是导入,而是在第一次执行文件(__name__ == '__main__'为真),所以主模块只导入一次。将起点移到辅助文件中,或检查__name__ == '__main__'。在

顺便说一下,circularimport是个坏主意。您应该解决循环导入(通过将foo移动到专用库)。或者,您可以使模块可重入(即在添加之前检查当前目录是否在sys.path中)。在

相关问题 更多 >