我最近问了这个问题,关于在python中导入任意数量的模块。我收到了两个很好的答案。当我在spyder中编程时,两者都起作用。
今天,我打算从终端运行脚本作为测试,因为我打算将代码移至服务器。但是这次,脚本因以下回溯而崩溃:
File "evaluation.py", line 27, in __init__
self.solvers.append( __import__(file_name[:-3]) ) #cut away .py
ImportError: No module named 'v00'
文件架构如下所示:
-evaluation.py
-evaluation
-v00.py
-v01.py
Evaluation.py中引起麻烦的代码是以下代码:
os.chdir('evaluation')
for file_name in glob.glob("*.py"):
self.solvers.append( __import__(file_name[:-3]) ) #cut away .py
for idx, solver in enumerate(self.solvers):
self.dqn.append(solver.DQNSolver() )
为什么这在spyder中起作用但在终端中不起作用?他们都使用python 3.5,在执行恶意代码时,我再次检查了它们是否都在“评估”文件夹中。
解决此问题的典型方法是通过添加一个空__init__.py
文件将文件夹变成一个包,然后使用import evaluation.v00
(或等效__import__
函数调用)从包中导入。但是您可能会遇到问题,因为您的主脚本与软件包的名称相同。我建议重命名其中一个
-evaluationscript.py
-evaluation
-__init__.py (empty file)
-v00.py
-v01.py
然后,您可能需要使用import_module而不是使用实际模块(而不是程序包)__import__
进行填充solvers
。
我对spyder不熟悉,但是如果相同的代码在那工作,那么它可能是使用PYTHONPATH
env var或通过修改将评估文件夹添加到搜索路径中sys.path
。
运行脚本时,脚本的路径将添加到模块导入的默认搜索路径,但是使用更改文件夹os.chdir
不会影响该搜索路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句