首页 > 解决方案 > 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

所以我的问题基本上是如何使这项工作。更详细地说:

标签: pythonvisual-studio-code

解决方案


刚刚制定了一个解决方案,如果有更优雅的方法,请告诉我。

我所做的如下,基本上将“ ; ”更改为“ : ”。然后它工作。

- "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[*]}")

必须有更好的解决方案,但以上方法现在对我有用,如果有人知道更好的解决方案,请告诉我!谢谢


推荐阅读