是否可以从Python包导入单个模块?

2024-10-01 19:26:03 发布

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

我有一个名为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以允许这样做


Tags: frompyimportflaskinitdefutilutils
1条回答
网友
1楼 · 发布于 2024-10-01 19:26:03

正如卡巴斯基指出的here,你可以用肮脏的方式来做:

>>> import sys
>>> sys.path.append("utils")
>>> from modC import util3
>>> util3()
Util 3

或者使用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,因为它不会找到其他地方,所以它最终会在那里找到它并将其作为模块而不是包加载

这显然在某些情况下不起作用,但对我有效

相关问题 更多 >

    热门问题