在VSCod中调试python模块的问题

2024-06-01 02:52:19 发布

您现在位置:Python中文网/ 问答频道 /正文

对于python实践项目,我有以下目录结构:

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

extract_digits.py如下所示:

^{pr2}$

armstrong_number.py中,我有以下内容:

from .extract_digits import extract_digits

如果我运行

python exercises/armstrong_number.py

我得到ModuleNotFoundError: no module named exercises

使用-m标志运行以下commad可解决此错误:

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,我必须在启动.json文件调试配置到

"module" : "ds-and-algo.${fileBaseNameNoExtension}"

如果我有嵌套文件夹配置,如:

exercises
├── tough
|   | __init__.py
|   ├──ex1.py
|   ├──ex2.py
├── easy

我再次需要手动编辑launch.json文件中的调试配置:(考虑子文件夹tough的情况)

"module": "exercises.tough.${fileBaseNameNoExtension}"

我需要实现一个一般情况,根据正在调试的文件,"module"文件中的"module"条目应该是:

"module": "folder1.folder2.folder3.....foldern.script"

就像fileBaseNameNoExtensionVSCode有{a1}:

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

我需要操作这个字符串并将其转换为exercises.tough.ex1,如果我可以在launch.json文件中的"module"条目中编写和执行bash命令,这就很简单了。但我做不到。但是,链接predefined variables in VSCode有一节关于命令变量,其中说明:

如果上面的预定义变量不够,可以通过${命令:commandID}语法。

这个链接有很多其他有用的信息。我不是python方面的专家,而且绝对不懂任何javascript,如果这是解决这个问题所必需的。在


Tags: and文件pyjsonnumberdsextractlaunch
3条回答

没有一种方法可以在launch.json中指定希望它计算出要调试的模块是什么。这是因为由于命名空间包允许任何目录代表一个包,所以在技术上不可能100%正确。最好的选择是为每个要在launch.json中运行的示例创建单独的调试配置(您可以有任意多个)。如果手工操作太繁琐,您可以编写一个Python脚本来为您生成launch.json

我不能重现你的错误:ModuleNotFoundError: no module named exercises

使用以下文件

exercises/extract_digits.py

def extract_digits(n):
  return 10

exercises/armstrong_number.py

^{pr2}$

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

如果当前目录是项目根目录并且您运行

python exercises/armstrong_number.py

你在控制台上看到10号


在visualstudio代码中,使用了错误的启动配置。

您只是在运行python程序,所以应该使用Python: Current File配置。 launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
    }
  ]
}
  1. 在任何目录下打开要运行/调试的示例py文件。在
  2. 或使其成为当前文件
  3. 选择调试侧栏
  4. 选择Python: Current File配置
  5. 单击“绿色”三角形。在

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


如果您真的需要启动模块,您可以在VSC中使用Multi-Root Workspace,并为每个根目录单独配置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}",
    }
  ]
}

我不确定是否要运行bash脚本,尽管如果可以在文件中运行JavaScript,"ds-and-algo.(${fileBaseNameNoExtension}).split('/').join('.')"应该可以做到。

{{cd2>实际上你不需要在cd2}中有文件。这些文件可能是空的,但是python使用它们来标识模块结构,从而允许嵌套和相对导入。我希望添加这些文件可以让您只运行python exercises/armstrong_number.py或{}

相关问题 更多 >