我无法让以下两个示例协同工作,dynamically loading a module和calling a function by string。我正在尝试动态加载和调用python模块。
我的文件结构如下
src/
main.py
__init__.py
modules/
__init__.py
module1.py
module2.py
...
module100.py
在我的main.py函数中,我有以下内容来加载模块,
mod = imp.load_source('module', '/path/to/module.py')
这似乎工作正常,print module
产生
<module 'module' from '/path/to/module.py'>
在module.py
我有
class module:
def __init__(self):
print ("HELLO WORLD")
def calc(self):
print ("calc called")
if __name__ == "__main__":
import sys
sys.exit(not main(sys.argv))
问题是当我尝试在模块中调用calc函数时,
result = getattr(module, 'calc')()
产生以下
HELLO WORLD
Traceback (most recent call last):
File "main.py", line 39, in main
result = getattr(module, 'calc')()
AttributeError: 'module' object has no attribute 'calc
我不确定我错过了什么或做错了
答案 0 :(得分:2)
出于某种原因,你也将你的课程命名为module
,这让你感到困惑。
您的module
是一个模块:
>>> mod = imp.load_source('module', 'module.py')
>>> mod
<module 'module' from 'module.pyc'>
>>> dir(mod)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'module']
您的课程为mod.module
:
>>> x = mod.module()
HELLO WORLD
>>> x
<module.module instance at 0xa1cb18c>
>>> type(x)
<type 'instance'>
旁边:行
self
不执行任何操作,并且您的calc
方法需要接受参数,或者当您调用它时,您将获得TypeError: calc() takes no arguments (1 given)
。