我有一个名为utils
的python包。它由几个模块和一个__init__.py
文件组成,将它们连接在一起
__init__.py:
from .modA import util1
from .modB import util2
from .modC import util3
modA.py:
def util1():
print("Util 1")
modB.py:
import flask # <-- Note this import
def util2():
print("Util 2")
modC.py:
def util3():
print("Util 3")
当导入此软件包的软件运行时,它运行在安装了flask的虚拟环境中,因此一切正常
我遇到的问题是,如果我在shell中以交互方式运行python
,并执行类似from utils.modC import util3
的操作,即使modC完全不依赖modB,并且不导入或使用flask,我仍然会得到一个错误,modB无法导入flask(假设我没有首先激活shell中的虚拟环境)
$ python3
Python 3.9.0 (default, Oct 27 2020, 14:15:17)
[Clang 12.0.0 (clang-1200.0.32.21)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from utils.modC import util3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/USERNAME/test/utils/__init__.py", line 2, in <module>
from .modB import util2
File "/Users/USERNAME/test/utils/modB.py", line 1, in <module>
import flask
ModuleNotFoundError: No module named 'flask'
在不修改包的源代码的情况下,我是否可以导入util3
而不在我的sys.path
中包含flask
(即不尝试导入__init__.py
中列出的所有内容)
如果做不到这一点,有没有简单的方法来修改__init__.py
以允许这样做
正如卡巴斯基指出的here,你可以用肮脏的方式来做:
或者使用PYTHONPATH env变量间接修改
sys.path
这是因为当您运行
from modC import util3
时,Python将开始在sys.path
中查找名为modC
的模块或包,这与我们运行from utils.modC import util3
时不同,在from utils.modC import util3
时Python正在查找名为utils
的模块或包。将字符串utils
附加到sys.path
会告诉它在最后一种方法中查找modC
,因为它不会找到其他地方,所以它最终会在那里找到它并将其作为模块而不是包加载这显然在某些情况下不起作用,但对我有效
相关问题 更多 >
编程相关推荐