多次导入同一模块
经过几个小时的调试,我终于找到了我应用程序中的一个错误原因。我的应用程序的文件结构大致是这样的:
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 本身不应该出现这样的错误。还有没有其他的解决办法,不需要每个文件都知道它的绝对位置呢?
2 个回答
5
修改
sys.path
不是在真正的程序中应该做的事情。这会影响程序的模块化和可移植性,而且没有比永久设置 PYTHONPATH 或把你的模块放在 Python 能找到的地方更好的选择。绝对不要使用
import *
。这样会污染你的命名空间,让你的代码变得不可预测。你不应该把 folderA 加到
sys.path
中。它是main
的一个子包,应该始终这样对待。总是使用绝对导入,直接指向顶层包:用import main.folderA
而不是import folderA
或其他任何方式;这样会让你的代码更容易理解、移动和安装。
5
不要这样修改 sys.path,因为这样会让你有两种方式(名字)来访问你的模块,这样会导致问题。
建议使用绝对导入或者明确的相对导入。 (模糊的相对导入可以在旧版本的 Python 中作为最后的选择使用。)
folderA/fileB.py
from main.folderA.fileA import * # absolute
from .fileA import * # unambiguous-relative
from fileA import * # ambiguous-relative
当然,你应该用具体的名字来代替那个星号。