通过路径导入Python模块
我遇到了一个不太好的情况:
有三个文件夹(A
、B
和 C
),里面都有一个叫 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
一样,从你应用的其他部分被导入。