我有以下不幸的情况:
三个目录(A
,B
和C
)包含一个带有函数M
的python模块F
。 (这些目录不是包,不可能改变任何情况。)
我正在寻找一种单独导入它们以访问其功能的方法。我如何导入这些模块以访问F
,如下所示:
A.F()
B.F()
C.F()
答案 0 :(得分: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...
答案 1 :(得分: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
。
答案 2 :(得分:1)
在每个A / B /和C /中添加__init__.py
。该文件的内容是
from M import F
以下代码应该起作用:
import A, B, C
A.F()
B.F()
C.F()
__init__.py
将目录声明为包,并在导入包时执行此文件中的语句。
答案 3 :(得分:-2)
使用import
from A.M import F as A_F