首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VSCode Python -调试包

VSCode Python -调试包
EN

Stack Overflow用户
提问于 2022-09-27 14:26:15
回答 2查看 114关注 0票数 0

我有一个暂时无法解决的问题,当涉及到使用VScode调试包时,我觉得这是一个微不足道的问题。当我有一个复杂的项目时,我设置了一个setup.py文件并创建了一个包,我在包中使用这个包来引用不同的模块。例如:

代码语言:javascript
复制
.
└── project_root
    ├── module1
    │   ├── f1.py
    │   ├── f2.py
    │   └── __init__.py
    ├── module2
    │   ├── f1.py
    │   ├── f2.py
    │   └── __init__.py
    └── module3
        ├── f1.py
        ├── f2.py
        └── __init__.py

############# IMPORTING CLASSES/METHODS ##################
### for example inside modules3.f1:
from project_root.module1.f2 import some_class

我总是使用虚拟环境。如果我用pip install .安装我的安装文件,那么导入该文件就会像预期的那样工作。不幸的是,当涉及到调试时,它只会尊重我的虚拟环境<virtual env name>/lib64/python3.8/site-packages/<package_name>中的文件的断点,而不是我正在project_root中处理的文件的断点。

所以我基本上有两个问题:

( a)是否有一种方法可以告诉VSCode使用我的文件而不是我的包的虚拟env包?

( b)我正在创建一个包,因为否则,我在父目录中引用文件时会遇到问题。是否有比立即设置setup.py并最终解决我的调试问题更好的方法来创建复杂的代码结构?

我的VScode launch.json设置如下:

代码语言:javascript
复制
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${fileDirname}",
            "args": ["-d"],
            "justMyCode":false  
            // add env
            "env": {
                "MODE": "True"
            }
        }
    ]
}

############更新##############################我希望这张图片能更好地描述我的问题。我设置了虚拟环境,在相同的文件、“工作目录”和虚拟env (v/lib/python3.8/site-packages/Packagename/module1/f1.py).中设置了断点。然后,我在调试器中执行我的脚本,V中的断点将激活,而不是工作dir中的那个。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-01 13:48:39

谢谢你@JialeDu为我指明了正确的方向。

我正在寻找的解决方案可以在这篇文章中找到:Visual Studio Code - How to add multiple paths to python path?

溶液

解决这个问题的方法是从Libary中删除包,如下面@JialeDu所述,并更新launch.json文件。将launch.json文件更新为:

代码语言:javascript
复制
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}",    //  <- THIS NEEDS TO BE 'workspaceFolder'
            "justMyCode":false,
            // add env
            "env": {
                "PYTHONPATH": "./"  // <- this is Equivalent to 'import sys; sys.path.append("./")'
            }
        }
    ]
}

通过这种方式设置launch.json,您可以访问工作区目录中的所有模块。

票数 0
EN

Stack Overflow用户

发布于 2022-09-30 08:28:54

原因

因为当您使用pip在虚拟环境中安装Packagename时,在您的Packagename/module3/f2.py脚本中,from Packagename.module1.f1 import function1实际上是从虚拟环境导入的,而在虚拟环境中使用的是function1

在示例的导入方法中,无法导入Packagename/module1/f1.py下的Packagename/module1/f1.py。(因为它们位于不同的文件夹中)

解决方案

如果希望Packagename/module3/f2.pyPackagename/module1/f1.py下使用function1,则导入语句应该是from module1.f1 import function1。因为这是一种导入其他文件夹的方法,所以您需要在代码的开头指定路径(参见下面的测试用例)。

下面是一些测试用例(以您提供的git为例)

首先,我们运行代码(f2.py),而不使用pip在虚拟环境中安装Packagename

我们将得到ModuleNotFoundError:...错误,因为此时python不能在不同的文件夹下导入函数。

然后创建一个虚拟环境,并使用命令pip install .在虚拟环境中安装Packagename。(现在运行f2.py执行问题中正在发生的事情)

为了更清楚地显示f2.py中使用的是哪个f2.py,我对两个文件中的function1做了以下修改。

Packagename\module1\f1.py

代码语言:javascript
复制
def function1(x, y):
    print(x * y)

v\Lib\site-packages\Packagename\module1\f1.py

代码语言:javascript
复制
def function1(x, y):
    print(x + y)

现在,运行f2.py并获得加法结果。所以很明显,它是在虚拟环境中使用function1

在这种情况下,如何使function1Packagename/module1/f1.py下使用?

使用sys.path.append()方法指定代码开头的路径

代码语言:javascript
复制
import sys
sys.path.append("./Packagename")
from module1.f1 import function1
function1(2,3)

获取multiplication结果

注意:使用上面的导入方法。如果您使用from Packagename.module1.f1 import function1的导入方法,即使前面的代码指定了路径,python也将首先使用安装在虚拟环境中的包。

如果您的虚拟环境没有安装Packagename包,则可以使用from Packagename.module1.f1 import function1导入方法。

未安装虚拟环境的原始代码

在虚拟环境中卸载Packagename

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73869280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档