几个小时后,我发现了应用程序中的错误原因。我的应用程序源代码如下:
main/
__init__.py
folderA/
__init__.py
fileA.py
fileB.py
真的,还有大约50个文件。但那不是重点。在main/__init__.py
中,我有以下代码:from folderA.fileA import *
在folderA/__init__.py
我有这段代码:
sys.path.append(pathToFolderA)
在folderA/fileB.py
我有这段代码:
from fileA import *
问题是fileA被导入两次。但是,我只想导入一次。
解决此问题的显而易见的方法(至少对我而言)是将某些路径从path
更改为folderA.path
但我觉得Python首先应该没有这个错误。还有哪些其他解决方法不需要每个文件知道它的绝对位置?
答案 0 :(得分:5)
不要以这种方式修改sys.path,因为它提供了两种访问模块的方式(名称),从而导致您的问题。
使用绝对值或unambiguous-relative imports代替。 (模糊相对导入可以作为旧版Python版本的最后手段。)
from main.folderA.fileA import * # absolute
from .fileA import * # unambiguous-relative
from fileA import * # ambiguous-relative
当然,您应该使用特定的名称代替那颗星。
答案 1 :(得分:5)
修改sys.path
不是您在实际程序中执行的操作。它会损害模块性和可移植性,而不会永久地设置PYTHONPATH或将模块放在Python可以找到的地方。
永远不要使用import *
。它会污染您的命名空间并使您的代码无法预测。
您不希望sys.path
上有folderA。它是main
的子包,应始终如此对待。始终使用绝对导入到顶级包:import main.folderA
而不是import folderA
或其他任何内容;它将使您的代码更易于跟踪和移动并安装。