【问题标题】:Programmatically import Python files as modules within another Python file and run them以编程方式将 Python 文件作为模块导入另一个 Python 文件并运行它们
【发布时间】:2017-11-14 02:22:23
【问题描述】:

有一个高度赞成的 StackOverflow thread 表示在另一个 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 中 执行(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(名称,*args,**kwargs) ImportError:没有名为“文件名”的模块

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

这很适合打印:

import glob, os

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

所以我不太确定前面的语句有什么问题或如何解决它。我也可以手动输入import,效果很好,但我还是想以编程方式完成,这样我就不必输入所有文件名,而且文件名会随着时间而改变。

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

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您提供的 SO 链接未涵盖其他导入方式,例如(尽管我并不认为这是一种规范的,甚至不一定是好的导入方式,但它对我有用)基于其中一个我通过这个 SO question/answers Building a minimal plugin architecture in Python 找到的示例我在下面编写了一个简单的插件实现 - 它在下面搜索一个名为“plugins”的文件夹,其中包含此文件的 .py 文件。每个插件都必须实现一个名为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多