2011-06-22 47 views
1

我想在这里做两件事情,动态地导入目录中的所有模块(数量/名称未知),然后对于找到的每个模块调用一个名为checkMe的函数)。 checkMe()保证在每个模块中,所以不需要检查。这是我到目前为止有:从模块的动态列表中调用方法

进口

import sys 
import os 
import glob 

pathname = os.path.dirname(sys.argv[0]) + "/" 
pathname = pathname + "/modules/" 

__modules__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(pathname)+"/*.py")] 

for module in __modules__: 
    __import__(module) 

调用checkMe()

for module in __modules__: 
    m = getattr(sys.modules[__name__], module) 
    getattr(m, 'checkMe').__call__() 

但我得到这个错误:

AttributeError: 'module' object has no attribute 'sendme' 

(sendme是第一个模块)

任何帮助非常感谢...谢谢!

+0

添加一些打印语句,以显示你得到什么'pathname','__modules__',等 –

+0

我很确定导入工作...我已经调试了,我没有得到这些线路的错误了。 – pdeuchler

+0

如果可能仍然有助于查看'__module__'中的结果。每当你分配给一个变量时,我都会添加打印语句,这样你就可以跟踪整个应用程序的状态并找出出错的地方。 –

回答

0

__import__有一些关于软件包(包含__init__.py的目录)与模块有关的棘手语义。您需要使用fromlist参数才能使其工作。正因为如此,通过路径运行的模块是最容易runpy(从评论:run_path需要Python 2.7或更新版本):

import runpy 
runpy.run_path('path/to/file.py') 
+0

就像我上面所说的那样,我非常肯定导入工作正常,这是在这些模块中调用方法,我遇到了实际麻烦 – pdeuchler

+0

@pdeuchler不,导入没有返回您期望的模块。 'help(__ import __)'应该说服你。 – Tobu

+0

@Tobu:“当从包中导入模块时,请注意'__import __('A.B',...)'在fromlist为空时返回程序包A,而fromlist时它的子模块B不为空。那? – JAB