有一个高度赞成的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
。
答案 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