python - VS Code(python):如何在不修改代码的情况下使模型导入正常工作(即解决 ModuleNotFoundError)
问题描述
我正在尝试在项目中运行一个脚本,该脚本可以简化为以下结构。在 vs 代码中,导入无法正常工作,我的问题是如何使其工作。
.
├── scripts
│ └── foo.py
└── src
├── mod1
│ ├── __init__.py
│ └── mod1
│ └── hoge.py
└── mod2
├── __init__.py
└── mod2
└── bar.py
在文件 ./scripts/foo.py 中,我尝试通过以下代码从 mod1.hoge 和 mod2.bar 导入:
import mod1.hoge as hoge
import mod2.bar as bar
if __name__=="__main__":
hoge.g(2)==bar.f(2,2)
这里, hoge.g 在 ./src/mod1/mod1/hoge/py 中定义如下:
import mod2.bar as bar
def g(a):
return bar.f(a,a)
它从 mod2.bar 导入,它可以是一些随机函数。
当我尝试运行 foo.py 它说
ModuleNotFoundError: No module named 'mod1'
所以我添加了一个launch.json,我在其中写道:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"env": {"PYTHONPATH": "${workspaceRoot}/src/mod1"}
}
]
}
但是这根本不起作用,所以我将环境更改为以下:
"env": {"PYTHONPATH": "${workspaceRoot}/src/mod1"}
这次,似乎从 foo.py 正确导入了 mod1,但是当 hoge.py 尝试导入 bar.py 时,它再次失败并出现以下错误
ModuleNotFoundError: No module named 'mod2'
具有以下回溯:
File "/pj1/src/mod1/mod1/hoge.py", line 1, in <module>
import mod2.bar as bar
File "/pj1/scripts/foo.py", line 1, in <module>
import mod1.hoge as hoge
所以我的问题基本上是如何使这项工作。更详细地说:
- 我可以在 lauch.json 中为 PYTHONPATH 分配多个路径吗?
我已经尝试了上述方法,但它确实有效。"env": {"PYTHONPATH": "${workspaceRoot}/src/mod1;${workspaceRoot}/src/mod2"}
- 如果可以分配多个路径,是否可以使用reg-ex?
- 有没有更好的方法来处理这个?
解决方案
刚刚制定了一个解决方案,如果有更优雅的方法,请告诉我。
我所做的如下,基本上将“ ; ”更改为“ : ”。然后它工作。
- "env": {"PYTHONPATH": "${workspaceRoot}/src/mod1;${workspaceRoot}/src/mod2"}
+ "env": {"PYTHONPATH": "${workspaceRoot}/src/mod1:${workspaceRoot}/src/mod2"}
此外,我想知道是否有更通用的方法可以做到这一点。于是,我在我的.bashrc中创建了一个env变量来获取src的子目录的所有路径,最终的launch.json如下
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"env": {"PYTHONPATH": ${env:SRCSUBDIRS}}
}
]
}
在 .bashrc 中:
SUBDIRARRY=(~/PATH/TO/src/*/)
export SRCSUBDIRS=$(IFS=:; echo "${SUBDIRARRY[*]}")
必须有更好的解决方案,但以上方法现在对我有用,如果有人知道更好的解决方案,请告诉我!谢谢
推荐阅读
- spring-boot - 如何在 Jooq 代码生成中使用 Liquibase 上下文
- ios - Swift中的结构访问多嵌套结构
- android - 为什么我的蓝牙应用不能在我的手机上运行而在另一部手机上运行
- python - 如何使用 Pandas 将一列拆分两次?
- spring-boot - 为什么Axon框架的'TrackingEventProcessor'会出现'ConversionException'?
- c# - 如何检查 C# 类型是否是静态构造的
- python - Pandas:concat 函数删除了数据帧的先前排序
- c# - 使用 .NET Core 将数组从 Ajax 发布到 cshtml.cs
- java - Java 游戏:在一个简单的游戏中射击子弹
- java - 让 Gradle 访问其项目之外的文件