通过路径导入Python模块

2 投票
4 回答
795 浏览
提问于 2025-04-17 02:17

我遇到了一个不太好的情况:

有三个文件夹(ABC),里面都有一个叫 M 的 Python 模块,里面有一个函数 F。这些文件夹不是包,而且我无法对这种情况做任何修改。

我想找到一种方法,能够分别导入它们,以便访问它们的功能。我需要怎么导入这些模块,才能像这样访问 F

A.F()
B.F()
C.F()

4 个回答

1

在每个 A/、B/ 和 C/ 文件夹里放一个 __init__.py 文件。这个文件的内容是:

from M import F

那么下面的代码应该可以正常运行:

import A, B, C
A.F()
B.F()
C.F()

这个 __init__.py 文件的作用是把这个文件夹声明为一个包,当你导入这个包的时候,里面的内容会被执行。

4

这样做是可以的,但感觉有点不太优雅...

import sys

sys.path.append("A")
import M as A

sys.path.pop()
del sys.modules['M']

sys.path.append("B")
import M as B

and so on...
4

你需要把东西放进一个新的本地字典里。你只能通过文件名来访问那些文件,而不能把它们当作模块来用,然后把它们放进一个模块类型里。

from types import ModuleType

with open("A/M.py") as a:
    A = ModuleType('A')
    exec a.read() in A.__dict__

with open("B/M.py") as b:
    B = ModuleType('B')
    exec b.read() in B.__dict__

with open("C/M.py") as c:
    C = ModuleType('C')
    exec c.read() in C.__dict__

然后就可以像你想要的那样通过 B.F() 来访问它们。唯一的问题是模块的元数据没有正确设置,所以它会看起来像是一个内置模块。你甚至可以这样做:

import sys
sys.modules['A'] = A
sys.modules['B'] = B
sys.modules['C'] = C

这样它们就可以像 import A 一样,从你应用的其他部分被导入。

撰写回答