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

发布于 2022-10-01 13:48:39
谢谢你@JialeDu为我指明了正确的方向。
我正在寻找的解决方案可以在这篇文章中找到:Visual Studio Code - How to add multiple paths to python path?
溶液
解决这个问题的方法是从Libary中删除包,如下面@JialeDu所述,并更新launch.json文件。将launch.json文件更新为:
{
// 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,您可以访问工作区目录中的所有模块。
发布于 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.py在Packagename/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
def function1(x, y):
print(x * y)v\Lib\site-packages\Packagename\module1\f1.py
def function1(x, y):
print(x + y)现在,运行f2.py并获得加法结果。所以很明显,它是在虚拟环境中使用function1

在这种情况下,如何使function1在Packagename/module1/f1.py下使用?
使用sys.path.append()方法指定代码开头的路径
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

https://stackoverflow.com/questions/73869280
复制相似问题