gpt4 book ai didi

python - 在 VSCode 中调试 python 模块的问题

转载 作者:行者123 更新时间:2023-12-04 16:42:29 31 4
gpt4 key购买 nike

我的python练习项目有以下目录结构:

.
├── data
├── ds-and-algo
├── exercises
| ├── __init__.py
│   ├── armstrong_number.py
│   ├── extract_digits.py
├── output

extract_digits.py看起来像这样:

def extract_digits(n):
pass

armstrong_number.py我有以下几点:

from .extract_digits import extract_digits

如果我运行,则从根项目目录

python exercises/armstrong_number.py

我得到 ModuleNotFoundError: no module named exercises
使用 -m 运行以下命令标志解决了错误:

python -m exercises.armstrong_number

但是使用 VSCode为了调试文件,我有以下调试配置 launch.json :
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Module",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"pythonPath": "${config:python.pythonPath}",
"module": "exercises.${fileBasenameNoExtension}",
"cwd": "${workspaceRoot}",
"env": {"PYTHONPATH":"${workspaceRoot}"}
}
]
}

但是这有几个问题:

1) 对于不同的文件夹,例如 ds-and-algo ,我必须手动编辑launch.json文件中的模块条目调试配置
"module" : "ds-and-algo.${fileBaseNameNoExtension}"

如果我有嵌套文件夹配置,例如:
exercises
├── tough
| | __init__.py
| ├──ex1.py
| ├──ex2.py
├── easy

我再次必须手动编辑 launch.json 中的调试配置文件到:(考虑子文件夹 tough 的情况)
"module": "exercises.tough.${fileBaseNameNoExtension}"

我需要实现一个一般情况,根据正在调试的文件, "module" launch.json 中的条目文件应该是:
"module": "folder1.folder2.folder3.....foldern.script"
就像 fileBaseNameNoExtension , VSCodesome other predefined variables :

其中一个变量是 relativeFile , 即当前打开的文件相对于 workspaceFolder 的路径
所以对于文件 ex1.py ,变量 relativeFile将是 exercises/tough/ex1.py .

我需要操作这个字符串并将其转换为 exercises.tough.ex1 ,如果我可以在 "module" 中编写和执行 bash 命令,这是微不足道的进入 launch.json文件。但我无法做到这一点。但是,链接 predefined variables in VSCode有一个关于 的部分命令变量 ,其中指出:

如果上面的预定义变量不够用,您可以通过 使用任何 VS Code 命令作为变量。 ${command:commandID} 句法。

此链接包含许多可能有用的其他信息。我不是 python 专家,绝对不知道任何 javascript,如果这是解决这个问题所必需的。

最佳答案

我无法重现您的错误:ModuleNotFoundError: no module named exercises .

使用以下文件
exercises/extract_digits.py

def extract_digits(n):
return 10
exercises/armstrong_number.py
from extract_digits import extract_digits

def armstrong_number(n):
return extract_digits(n)

if __name__ == "__main__":
print armstrong_number(3)

如果您使用 Python3,请将打印语句更改为: print(armstrong_number(3))并更改使用的 Python 解释器。

如果您的当前目录是项目根目录并且您运行
python exercises/armstrong_number.py

你在控制台中得到数字 10

在 Visual Studio Code 中,您使用了错误的 Launch 配置。

你只是在运行 python 程序,所以你应该使用 Python: Current File配置。 launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
}
]
}
  • 在任何目录中打开要运行/调试的示例 py 文件。
  • 或将其设为当前文件
  • 选择调试侧栏
  • 选择 Python: Current File配置
  • 单击“绿色”三角形。

  • 现在构建并运行一个复杂的命令。它会将 CWD 设置为当前文件的目录并在当前文件上启动调试器。

    如果您 真的需要模块启动你可以使用 Multi-Root Workspace在 VSC 中并有一个单独的配置 launch.json对于每个根目录

    如果您想使用 ${command:commandID}语法,您可以构造一个使用 activeTextEditor 的简单扩展。并根据文件名构造一个字符串

    编辑

    另一种选择是使用多启动配置。

    我已经删除了默认值有效或未使用的属性。
    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Exercise",
    "type": "python",
    "request": "launch",
    "console": "integratedTerminal",
    "module": "exercises.${fileBasenameNoExtension}",
    },
    {
    "name": "Exercise.Easy",
    "type": "python",
    "request": "launch",
    "console": "integratedTerminal",
    "module": "exercises.easy.${fileBasenameNoExtension}",
    },
    {
    "name": "DS",
    "type": "python",
    "request": "launch",
    "console": "integratedTerminal",
    "module": "ds.${fileBasenameNoExtension}",
    }
    ]
    }

    您可以使用扩展名 Command Variable使用点分隔符获取此相对目录。
    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Python: Module CmdVar",
    "type": "python",
    "request": "launch",
    "console": "integratedTerminal",
    "module": "${command:extension.commandvariable.file.relativeDirDots}.${fileBasenameNoExtension}",
    }
    ]
    }

    关于python - 在 VSCode 中调试 python 模块的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57392698/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com