python - Mac python与spyder中的不同模块导入
问题描述
我最近问过这个关于在 python 中导入任意数量的模块的问题。我收到了两个很好的答案。当我在 spyder 中对其进行编程时,两者都有效。
今天我从终端运行脚本作为测试,因为我打算将我的代码移动到我的服务器。但这一次脚本因 Traceback 而崩溃:
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
。
When you run a script, the path of the script is added to the default search path for module imports, but changing the folder using os.chdir
won't affect that search path.
推荐阅读
- eclipse - 尝试通过 Marketplace 在 Eclipse 中安装软件时如何解决 SunCertPathBuilderException?
- android - RecyclerView 按具体细节排序
- javascript - 获取子组件Vue中的v-model值
- intellij-idea - 如何在 IntelliJ 中重新格式化所有打开的文件
- android - 箭头在 Kotlin 中的作用是什么?
- angular - 架构上的角度拖放
- javascript - 无法从内部删除 div 中的类,JS
- azure-ad-b2c - 将 Azure AD B2C KMSI 复选框置于登录按钮下方
- angularjs - Integrating Webpack with angular.js
- amazon-web-services - AWS 负载均衡器日志中的日志标头或在 5xx 系列上执行操作