为python目录中的每个模块调用特定函数

为python目录中的每个模块调用特定函数,python,file,import,module,Python,File,Import,Module,关于堆栈溢出的所有答案都没有帮助我解决此问题: 我的文件结构如下: -run.py -/董事会 -Brd1.py -Brd2.py -Brd3.py 我试图完成的是为boards目录中的每个模块调用“run”函数。每个模块都有此“运行”功能。以下是我在run.py中的代码: import os import sys,imp import inspect for item in os.listdir("boards"): if item.startswith("Brd") and it

关于堆栈溢出的所有答案都没有帮助我解决此问题:

我的文件结构如下: -run.py -/董事会 -Brd1.py -Brd2.py -Brd3.py

我试图完成的是为boards目录中的每个模块调用“run”函数。每个模块都有此“运行”功能。以下是我在run.py中的代码:

import os
import sys,imp
import inspect

for item in os.listdir("boards"):
    if item.startswith("Brd") and item.endswith(".py"):
        curr_module = imp.new_module(item)
        curr_module.run()
这是我得到的错误:

AttributeError:“模块”对象没有属性“运行”

但是,当我明确地做这样的事情时:

from boards import Brd1

Brd1.run()
它工作得很好。 有趣的是,代码:

import os
import sys,imp
import inspect

for item in os.listdir("boards"):
    if item.startswith("Brd") and item.endswith(".py"):
        curr_module = imp.new_module(item)
        print dir(curr_module)
仅打印: [“文件”、“名称”、“包装”]


我想完成的事情还有什么要做的吗?我现在就去吗

您没有做任何事情来加载模块,您只是创建并运行空模块

curr_module = imp.new_module(item)
curr_module.run()
他说:

imp.new\u模块
(名称)

返回名为name的新空模块对象。此对象未插入sys.modules中

所以,这实际上与你写的是一样的:

curr_module = types.ModuleType(item)
curr_module.run()
您得到
[''''''''''''''''''''''''''''''''''''''''''.'包'.'''.''.''.'包'.''.''.'包'.''.''.''.''.''.'.'.'''.'.'.'.'.''.'.'.'.'.'.''.'.'.''.''.''.'.'代码>
的原因是,即使在一个空模块上也存在这些属性


您从中复制的示例代码尝试执行完全不同的操作。这个问题的关键是如何用一系列源代码而不是通常的方式创建一个模块。您可以(在2.x中)创建一个新的空模块,然后对该模块的全局执行
exec
exec
是模块最终不是空的原因,而您没有做任何类似的事情


您还为模块指定了一个无效的名称,例如
Brd1.py
而不是
Brd1


如果要实际加载模块,请查看:

当然,您不希望通过常规搜索加载它,而是通过路径名加载它。您可以将
路径
参数传递给
查找模块

name = os.path.splitext(item)[0]
fp, pathname, description = imp.find_module(name, 'boards')
…或直接加载它:

name = os.path.splitext(item)[0]
pathname = os.path.join("boards", item)
desc = [s for s in imp.get_suffixes if s[0] == '.py']
with open(pathname) as f:
    curr_module = imp.load_module(name, f, pathname, desc)

您可能还希望将模块放入
sys.modules
。或者你可能不会。(该示例没有,因为它模拟的是
\uuuuu import\uuuu
函数的效果。)如果是这样:


您可能还需要执行
sys.modules
检查,如示例所示。如果您执行检查,尝试导入同一文件两次将在第二次使用缓存版本,就像您执行了正常的
导入
;如果不这样做,则类似于调用
reload

try:
    curr_module = sys.modules[name]
except KeyError:
    # the logic above to find and load curr_module

这可能对您不起作用,因为正如abarnert指出的,您只加载了一个空模块。此外,查看您的文件结构,您需要插入boards文件夹的路径名:

sys.path.insert(0, './boards')
只需使用导入内部构件的python文档即可解决您的问题:

我刚刚测试了它,这段代码完全符合您的要求:

for item in os.listdir("boards"):
    if item.startswith("Brd") and item.endswith(".py"):
        name = os.path.splitext(item)[0]
        fp, pathname, description = imp.find_module(name)
        with open(pathname) as f:
            curr_module = imp.load_module(name, fp, pathname, description)
            curr_module.run()

“关于堆栈溢出的所有答案都没有帮助我解决这个问题”,这对我们并没有真正的帮助。你看了哪些问题和答案?他们怎么不帮忙?这不管用。我得到一个警告:没有名为的模块Brd1@kaaazemian“我遇到了一个可怕的事情”是无法调试的。你试过上面三个选项中的哪一个?你的代码看起来像什么?例外情况从何而来?
sys.path.insert(0, './boards')
for item in os.listdir("boards"):
    if item.startswith("Brd") and item.endswith(".py"):
        name = os.path.splitext(item)[0]
        fp, pathname, description = imp.find_module(name)
        with open(pathname) as f:
            curr_module = imp.load_module(name, fp, pathname, description)
            curr_module.run()