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

时间:2017-06-12 14:45:09

标签: python-3.x

有一个高度赞成的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中           exec(code_obj,self.user_global_ns,self.user_ns)         文件“”,第4行,in           导入文件名         在do_import中输入文件“C:\ Program Files \ JetBrains \ PyCharm Community Edition 2017.1.3 \ helpers \ pydev_pydev_bundle \ pydev_import_hook.py”,第21行           module = self._system_import(name,* args,** kwargs)       ImportError:没有名为'filename'的模块

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

这适用于打印:

import glob, os

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

所以我不确定早期声明的问题是什么或如何解决它。我也可以手动执行import并且工作正常,但我还想以编程方式执行此操作,这样我就不必键入所有文件名,因为文件名会随着时间的推移而改变。

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

1 个答案:

答案 0 :(得分:2)

例如,您提供的SO链接未涵盖其他导入方式(尽管我并未将其视为一种规范的,甚至不一定是好的导入方式,但它对我有用)基于我通过这个SO问题/答案找到的一个例子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