前言
配置基于VS Code的Python远程调试环境,并且基于VS Code 的Python 远程调试docker容器中代码。
解决本地物理机无需安装相关的依赖库和依赖包进行代码调试
环境
环境名 | 系统 | ip | 项目目录 |
---|---|---|---|
本地 | window | 192.168.5.133 | D:\hello_ftp_sync_debug |
远程服务器 | linux | 192.168.10.200 | /home/workspace/hello_world |
远程docker容器 | linux | 172.17.0.2 | /hello_world |
正文
1、准备
拓展安装“Python” 使用pip在本地计算机和远程计算机安装:pip install ptvsd
2、使用ptvsd实现远程调试
第一步:配置launch.json
配置launch.json文件,它的位置一般在VS Code当前的工作目录下的/.vscode/launch.json。没有找到也没关系,等会配置时会自动创建。
在VS Code的侧边栏 -> debug -> python -> 远程连接 -> 输入主机名,端口号 配置lauch.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: 远程连接",
"type": "python",
"request": "attach",
"connect": {
"host": "192.168.10.200",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/home/workspace/hello_world"
}
]
},
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
第二步:创建ptvsd的python文件
在本地的main.py文件写入以下内容
import ptvsd
# Allow other computers to attach to ptvsd at this IP address and port.
ptvsd.enable_attach(address =('192.168.8.133',5678)) ## 禁止使用0.0.0.0
# Pause the program until a remote debugger is attached
ptvsd.wait_for_attach()
import sys
while True:
print(sys.platform)
print("****************这只是个测试****************")
第三步:复制到远程服务器并注释本地ptvsd
将main.py文件上传到远程Linux服务器上面(为了方便同步远程和本地的文件,建议采用ftp-sync文件同步插件), 确保本地和远程的测试文件内容完全相同,然后将本地main.py的头部代码注释掉,切记不要删除!本地代码如下所示:
# import ptvsd
# # Allow other computers to attach to ptvsd at this IP address and port.
# ptvsd.enable_attach(address =('192.168.8.133',5678)) ## 禁止使用0.0.0.0
# # Pause the program until a remote debugger is attached
# ptvsd.wait_for_attach()
import sys
while True:
print(sys.platform)
print("****************这只是个测试****************")
第四步:在Linux远程服务器上输入以下命令行
利用ptvsd运行程序main.py
python3 -m ptvsd --host 192.168.10.200 --port 5678 --wait main.py
## 没成功过
#如果要以包的方式运行程序,只需在前面加上 -m , 例如
python3 -m ptvsd --host 192.168.10.200 --port 5678 --wait -m hello_world
第五步:在本地执行remote attch debug
在远程执行ptvsd命令后,服务器程序进入等待debug状态,此时在本地代码中设置断点,选择remote attach 执行debug,出现以下debugging toolbar,则表示配置成功;否则,请看备注,或者自行google解决问题
此时,本地端出现正常的debug界面,远程端出现
$ python3 -m ptvsd --host 192.168.10.200 --port 5678 --wait main.py
linux
****************这只是个测试****************
3、Ftp-sync 文件同步
前面我提到本地和远程服务器的文件同步的问题,其实只需要在VScode中安装扩展插件ftp-sync 就可以完美地解决这个问题,下面介绍其配置过程。
ftp-sync配置:
在安装好ftp-sync插件后,使用快捷键Ctrl+Shift+P打开菜单,输入ftp-sync,出现八种可用的ftp-sync命令,我们首先使用Ftp-sync: Init打开ftp-sync的配置文件ftp-sync.json,配置内容如下: 在这里插入图片描述
{
"remotePath": "/home/workspace/hello_world", //服务器代码的存放位置 ,只能绝对路径
"host": "127.0.0.1", //远程服务器的ip地址
"username": "root", //服务器的username
"password": "123456", //服务器的password
"port": 22, // 端口号,sftp默认为22,ftp默认为21
"secure": false,
"protocol": "sftp", //协议 sftp 或者 ftp 均可
"uploadOnSave": false,
"passive": false,
"debug": false,
"privateKeyPath": null,
"passphrase": null,
"agent": null,
"allow": [],
"ignore": [
"\\.vscode",
"\\.git",
"\\.DS_Store"
],
"generatedFiles": {
"extensionsToInclude": [
""
],
"path": ""
}
}
常用命令解析:
-
Ftp-sync: Init //初始化Ftp-sync配置文件
-
Ftp-sync: Upload File //同步本地文件或文件夹到远程
-
Ftp-sync: Download File //从远程下载文件
-
Ftp-sync: Local to Remote //同步本地文件到远程
-
Ftp-sync: Remote to Local //同步远程文件到本地
-
Ftp-sync: Commit // 提交
-
Ftp-sync: Sync current file to Remote 同步当前文件到远程
4、使用ptvsd实现远程服务器的容器调试
第一步:先配置使用ptvsd实现远程调试
第二步:启动指定docker容器
启动容器,映射ip端口,挂载本地目录到容器目录中
$ docker run -it --rm --name pt1 -v $(realpath ~/workspace/hello_world):/hello_world -p 8888:8888 -p 5678:5678 pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel
第三步: 容器内安装ptvsd
$ cd /hello_world
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
第四步:容器内查看ip地址以及启动ptvsd
$ apt-get update && apt install net-tools
$ ipconfig
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 10907 bytes 30934846 (30.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9890 bytes 589169 (589.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ python -m ptvsd --host 172.17.0.2 --port 5678 --wait main.py
第五步:在本地执行remote attch debug
在远程执行ptvsd命令后,服务器程序进入等待debug状态,此时在本地代码中设置断点,选择remote attach 执行debug,出现以下debugging toolbar,则表示配置成功;否则,请看备注,或者自行google解决问题
此时,本地端出现正常的debug界面,远程端出现
$ python -m ptvsd --host 172.17.0.2 --port 5678 --wait main.py
linux
****************这只是个测试****************
备注
通常你选择的端口可能会存在被其他程序占用的情况,此时会报Address already in use的错误,建议使用Linux命令 netstat -anp
查询可用的端口号,或者用命令netstat -tunpl|grep
端口号查看占用当前端口的进程,并kill
(此方法慎用)。