提问人:Hack-R 提问时间:6/12/2017 更新时间:6/13/2017 访问量:506
以编程方式将 Python 文件作为模块导入到另一个 Python 文件中并运行它们
Programmatically import Python files as modules within another Python file and run them
问:
有一个高度赞成的 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
答:
您给出的 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
评论