以编程方式将 Python 文件作为模块导入到另一个 Python 文件中并运行它们

Programmatically import Python files as modules within another Python file and run them

提问人:Hack-R 提问时间:6/12/2017 更新时间:6/13/2017 访问量:506

问:

有一个高度赞成的 StackOverflow 线程说,在另一个 Python 文件中运行 Python 文件的最佳方式是将它们作为一个模块。import

这对我来说效果很好,除了在至少有数百个(如果不是数千个)文件要运行的情况下,我无法以编程方式执行此操作。

所有文件都位于同一目录中,并共享通用的命名约定。我试着像这样运行它们:

import glob, os

for filename in glob.glob("*_decomp*"):
    import filename

但这会抛出一个错误:

Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\IPython\core\interactiveshell.py", line

3066, 在run_code exec(code_obj、self.user_global_ns、self.user_ns) 文件 “”,第 4 行,在 导入文件名 文件“C:\Program Files\JetBrains\PyCharm Community Edition 2017.1.3\helpers\pydev_pydev_bundle\pydev_import_hook.py”,第 21 行,在do_import中 模块 = self._system_import(name, *args, **kwargs) ImportError:没有名为“filename”的模块

该变量在 IDE 中也用红色下划线表示,这否定了我最初的假设,即它只是需要删除 .py 文件扩展名的问题。filename

这适用于打印:

import glob, os

for filename in glob.glob("*_decomp*"):
    # import filename
    print(filename)

所以我不太确定前面的陈述有什么问题,或者如何解决它。我也可以手动执行,这工作正常,但我想再次以编程方式执行此操作,这样我就不必键入所有文件名,并且文件名会随着时间的推移而更改。import

最后,我还尝试了(即)删除文件扩展名,但同样仅适用于 而不是 .[:-3]filename[:-3]print()import

蟒蛇-3.x

评论


答:

2赞 DisappointedByUnaccountableMod 6/13/2017 #1

您给出的 SO 链接未涵盖其他导入方式,例如(尽管我并不认为这是规范的,甚至不一定是好的导入方式,但它对我有用)基于我通过这个 SO 问题/答案找到的示例之一 在 Python 中构建最小的插件架构 我在下面写了一个简单的插件实现 - 它会在.py文件下面的任何位置搜索一个名为“plugins”的文件夹有了这个,它就是。每个插件都必须实现一个名为 Plugin 的类,它们都获得相同的参数。

path = 'plugins'
# find subdirs of the path - these are the groups
# for each group, load all the .py files, each provides one or more actions
searchdir = os.path.join(os.path.split(__file__)[0],path)
if os.access(searchdir, os.F_OK):
    print "searchdir=",searchdir
    print "results=",os.walk(searchdir)
    (root, dirs, files) =os.walk(searchdir).next()
    print root,dirs,files
    for dir in dirs:
        print "scanning dir",dir
        self.groups[dir] = []
        sys.path.insert(0, os.path.join(root,dir))
        for f in sorted(os.listdir(os.path.join(root,dir))):
            print "looking at",f
            fname, ext = os.path.splitext(f)
            if ext == '.py':
                print "importing ",f
                mod = __import__(fname)
                try:
                    self.groups[dir].append(mod.PlugIn(group,cmdobj,config, jts_data, directives, current_config_props,allcomponents,globals))
                except:
                    print "URGH! plugin instantiation error!"
                    raise
        sys.path.pop(0)
else:
    print "############# no plugins folder",searchdir