问题描述
在近期基于VSCODE开发的Python项目中,由于子模块逻辑较为复杂,需要在子模块的路径下进行调试。
文件目录结构如下:
+--- logic
| +--- robot_mission_behaviors.py
| +--- __init__.py
+--- robot_api
| +--- Packaging.py
| +--- robot_interface.py
| +--- robot_tcp_socket.py
| +--- __init__.py
+--- main.py
然而在VSCODE Terminal运行该子程序,就会出现如下ModuleNotFoundError报错:
(venv) E:\robot-execution-middleware\src\robot_execution_middleware\logic>python robot_mission_behaviors.py
Traceback (most recent call last):
File "robot_mission_behaviors.py", line 5, in <module>
from robot_api.robot_interface import RobotInterface
ModuleNotFoundError: No module named 'robot_api
查阅了几篇文章,回忆起这是一个典型的PYTHONPATH环境变量配置问题。
对于调试来说,最快的解决方案就是在待调试的程序的顶部增加如下语句:
import sys; sys.path.append("..")
该语句可以解决在子模块路径下不能import的问题。然而,在其他路径运行这个程序,问题还会存在。查阅了一些文章,设置PYTHONPATH的文章有很多。但在一个新的运行环境下,每次都需要重新配置下,这对于协作开发很不友好。本文想要找到一个能将PYTHONPATH配置固化下来的方案,这样同事拉取代码后,到子模块就可以直接运行调试,而不是再进行一遍配置。
研究了这篇通过.env文件配置PYTHONPATH的文章,感觉其不够完美。一是其把.env文件隐藏到.vscode目录了,而该目录习惯上是不会托管到git的。另一个是该文章修改了setting.json,换一台机器运行还需要修改该文件。
解决方案
下面给出本文的思路:
1. 首先需要确认下,VSCODE默认去哪里读取.env文件。
- 进入File->Preferences->Settings
- 点开 Extensions->Python
- 找到Env File配置
- 这里可以看到,VSCODE默认在工程根目录${workspaceFolder}下寻找.env文件,这里我们不做修改,只是确认.env文件放在哪里VSCODE会默认执行 (本文基于默认配置进行环境变量设置,是为了确保重新拉取代码后,基于默认的配置依然能够生效)
2. 在${workspaceFolder}也就是项目根目录下创建.env文件。
3. 在.env增加如下环境变量配置:
PYTHONPATH="${workspaceFolder}\src\robot_execution_middleware;${env:PYTHONPATH}"
- 由于采用了VSCODE内置环境变量${workspaceFolder},解决了用绝对路径设置PYTHONPATH时,工程路径迁移就要重新配置的问题
- 注意${workspaceFolder}是工程的根目录,而不是Python的工程目录。如本文的Python工程目录是${workspaceFolder}\src\robot_execution_middleware
PYTHONPATH验证
在VSCODE Terminal下验证PYTHONPATH配置:
echo %PYTHONPATH% #Windows
echo $PYTHONPATH #Linux
结果如下:
(venv) E:\robot-execution-middleware>echo %PYTHONPATH%
E:\robot-execution-middleware\src\robot_execution_middleware;