在使用vscode中,虽然vscode可以高度自定义,里面的一些插件确实也让自己难以自拔。但是,与Pycharm比较,还是有一些瑕疵的,比如说包以及模块的导入。在Pycharm中因为它是自己把工程目录给加入到sys.path
中,所以在导包方面还是非常非常的nice de。
如下面一个工程的结构,工程名是experiences
,下面有parent
包。parent
包有parent_main.py
以及child
子包,child
包里面有模块child_main.py
。
experiences
--------parent
----------------parent_main.py
----------------child
------------------------child_main.py
parent_main.py
def parent_main_func():
print('parent_main_func')
if __name__ == '__main__':
import sys
for a_path in sys.path:
print(a_path)
在Pycharm运行parent_main.py
,可以得到结果:
D:\nwq\Documents\pythonProjects\experiences\parent
D:\nwq\Documents\pythonProjects\experiences
D:\miniconda3\python37.zip
D:\miniconda3\DLLs
D:\miniconda3\lib
D:\miniconda3
D:\miniconda3\lib\site-packages
D:\miniconda3\lib\site-packages\win32
D:\miniconda3\lib\site-packages\win32\lib
D:\miniconda3\lib\site-packages\Pythonwin
在vscode中运行parent_main.py
,可以得到结果:
d:\nwq\Documents\pythonProjects\experiences\parent
D:\miniconda3\python37.zip
D:\miniconda3\DLLs
D:\miniconda3\lib
D:\miniconda3
D:\miniconda3\lib\site-packages
D:\miniconda3\lib\site-packages\win32
D:\miniconda3\lib\site-packages\win32\lib
D:\miniconda3\lib\site-packages\Pythonwin
两者相比,很明显可以得到vscode中少了路径D:\nwq\Documents\pythonProjects\experiences
,即工程路径。这使得在vscode导包时会不舒服。举个栗子,在child_main.py
文件中在pycharm是可以导入parent
模块的,但是在vscode中却会报:ModuleNotFoundError: No module named 'parent'
错误。
child_main.py
if __name__ == "__main__":
from parent.parent_main import parent_main_func
parent_main_func()
vscode有两个重要的配置文件:launch.json和settings.json。launch.json
是使用VS Code运行调试程序的启动设置,包括设置环境变量,使用哪个解释器,debug类型以及程序入口等等。settings.json
是VS Code程序的设置选项,包括快捷键,插件设置等等。
在Python中有一个环境变量PYTHONPATH,在得到模块搜索路径时,PYTHONPATH
会和其他模块搜索路径连接在一起得到程序的模块/包搜索路径。所以下面的方法都是通过设置PYTHONPATH
环境变量实现。
因为launch.json
可以设置环境变量,所以在launch.json
可以添加PYTHONPATH
环境变量,那么就可以实现把自己想要加入的包导入到路径中了。根据官网的介绍可以在launch.json
中设置变量env
来设置PYTHONPATH
值,具体设置代码如下,重点是最后一行设置env
项。
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: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"env": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"}
}
]
}
在.vscode
文件夹下保存,按下F5
键debug
代码,那么就可以得到结果,而不是报找不到模块错误。:
parent_main_func
但是当你点击右上角Run Python File in Terminal
按钮时,还是会报错的哦。
通过envFile
设置PYTHONPATH
环境变量既可以在launch.json
也可以在settings.json
中设置,下面是其设置的代码。envFile
是一个存储变量的文件,后缀名为.env
。${workspaceFolder}
是工作空间文件夹路径名。
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: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
// "env": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"}
"envFile": "${workspaceFolder}/.env"
}
]
}
settings.json
{
"python.formatting.provider": "autopep8",
"python.pythonPath": "D:\\miniconda3\\python.exe",
"python.envFile": "${workspaceFolder}/.env",
}
.env
PYTHONPATH="${workspaceFolder};${env:PYTHONPATH}"
和设置env
一样,可以debug
运行,但是右上角Run Python File in Terminal
按钮时,还是会报错的哦。
terminal.integrated.env.windows
设置的环境变量可以在VS Code
运行的Windows终端下使用。是在settings.json
文件中设置的。
settings.json
{
"python.formatting.provider": "autopep8",
"python.pythonPath": "D:\\miniconda3\\python.exe",
// "python.envFile": "${workspaceFolder}/.env",
"terminal.integrated.env.windows": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"}
}
无论你是按F5
键debug
还是点击右上角Run Python File in Terminal
按钮,都可以很好地解决哦。