最近因为一个基于Python的项目需要使用到很多陌生的第三方包,但python的特点又是安装的时候可以帮你解决依赖,但卸载的时候又不给你删除依赖,因此想要使用一个虚拟环境来实现这个项目,而且是基于我惯用的VS Code,总结一些要点。
感觉网上有很多文章将虚拟环境和python版本混为一谈,所谓虚拟环境,它的目的是解决不同项目同时依赖同一个第三方包,但是对版本要求却不一样的问题【python版本是固定的】,因此需要设置“分隔”,即虚拟环境,来实现不同项目运行在不同环境下,这样安装的包也只会在该环境下,不直接安装在python目录下。这样做的缺点也很明显,那就是占用磁盘,同一个包可能安装了好几遍。好处就是既实现了环境分隔,在打包成exe可执行程序时体积也会更小。
如何实现python虚拟环境,貌似有很多种方式,主要是使用不同的包,或者是换软件,如anaconda,pycharm等。如果要使用VS Code,只能是使用不同类型的包,但是这里还是推荐使用最为广泛且使用不复杂的包——venv
,这个包在安装python时就已经安装了。
附:官网链接
首先进入到项目文件夹,在终端输入
python -m venv ./venv
然后就会发现在项目文件夹下生成了一个名为venv
的文件夹,当然,还可以加上其他的参数,在终端输入python -m venv -h
可以查看所有的参数:
创建好环境后,如果需要在该环境下安装包,需要先激活环境:
.\venv\Scripts\Activate.ps1
如果要运行代码,建议关闭Code Runner插件,而是点击python插件中的运行按钮,只要在同一个终端运行即可。因为虚拟环境的本质实际上就是修改当前终端的环境变量,让执行的命令指向创建的环境,而不是电脑上安装的python环境。
总的来说,venv这个包使用还是挺简单的
前面提到,虚拟环境只能解决相同python版本,不同第三方包的情况,那问题来了,如果项目对python版本也挑怎么办?唯一的解决办法就是在电脑上安装多个python版本,然后通过改变文件名来解决命令行冲突的问题。
以我的Windows为例,原来已经安装了python3.10,后来又装上了3.8,为了避免版本冲突问题,我将python.exe
修改为py38.exe
:
这样在使用这个版本的python时,应该输入py38 .....
,但是在使用venv这个包时发现了一个问题,那就是执行py38 -m venv ./venv
时会报错:[WinError 2] 系统找不到指定的文件,通过查找资料在这个链接中找到一个大佬的帖子:
因此只需要将venv中的初始化文件修改一下即可。
参考链接
如果是别人做好的项目在自己电脑上怎么运行呢?venv这个包有一个特点,那就是在创建时会在复制的执行程序当中写入当前电脑中python环境的绝对路径,因此如果换一台设备基本可以确定不能使用,所以要想实现移植,首先要在原电脑上进入虚拟环境再导出包目录:
pip freeze > requirements.txt
此时会在项目路径下生成一个txt文件。
当在另一台设备上运行这个项目时,首先在venv确定一下python的版本:
确定版本后,在项目文件夹下,使用对应的python版本运行venv
,带上--clear
参数即可清除之前的虚拟环境。
然后就是配置第三方包。进入虚拟环境,执行下面的命令即可。
pip install -r .\requirements.txt
到此虚拟环境就移植好了。
在VS Code上使用虚拟环境的主要问题在于代码编写时不会有提示,因为静态检查中只会去搜索电脑自带的python环境,而不会搜索当前项目下的虚拟环境。
解决办法也很简单,加上虚拟环境的路径即可。
补上这一项即可
"python.autoComplete.extraPaths": [
"./venv/Lib/site-packages"
],
不过这样设置的限制也很大,首先是VS Code必须打开项目所在文件夹,而不能打开它的父级文件夹,这样保证上面的.
代表的是项目文件夹。其次就是虚拟环境的文件夹名字只能是venv
,这样保证上面这个路径能找到对应的包。所以如果项目比较复杂,建议还是用pycharm之类的软件,虚拟环境这块要方便点。