gpt4 book ai didi

python - 模块导入两次。 Python解释器中可能存在的错误

转载 作者:行者123 更新时间:2023-11-30 23:46:55 25 4
gpt4 key购买 nike

我在我的一个项目中制定了一个相当人为的导入方案,我想我可能发现了 Python 解释器中的一个错误,导致模块被导入两次。

这是我的测试项目的设置方式:

  • /

    • Launcher.bat — 项目从这里运行。它使用 Python 3.2 可执行文件启动“main/__init__.py”

    • ma​​in/__init__.py__main__ 脚本,由“Launcher.bat”启动的脚本

    • ma​​in/foo.py — 包含一个空类

    • external/__init__.py - “主”项目脚本外部的脚本,用于演示问题

./Launcher.bat

@echo off
C:\Python32\python.exe main\__init__.py
pause

./main/__init__.py

from foo import Foo
print("In 'main', Foo has id:", id(Foo))

# Add the directory from which 'Launcher.bat' was run,
# which is not the same as the './main' directory
# in which this script is located
import sys
sys.path.insert(1, '.')


# This script will try to import class Foo, but in doing so
# will casue the interpreter to import this './main/__init__.py'
# script a second time.
__import__('external')

./main/foo.py

class Foo:
pass

./external/__init__.py

from main.foo import Foo
print("In 'external', Foo has id:", id(Foo))

所有这些都会打印两次“主脚本已导入”消息。如果外部脚本导入任何其他脚本,这些脚本也将被导入两次。我只在 Python 3.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 列表中询问更权威的答案。您执行一次(当您运行脚本时)并导入一次(从外部),因此该行被打印两次。它不会导入两次。

但是,这是一个可怕的设置。这里有很多风格违规的地方。尽管有些仅用于演示目的,但它仍然相当困惑。

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

关于python - 模块导入两次。 Python解释器中可能存在的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8644596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com