不执行activate直接使用Python虚拟环境

2021-12-22

< view all posts

最近在开发时,有时希望能执行某个依赖于特定虚拟环境的脚本,但又不希望每次都执行activate将虚拟环境切换过去,这样来回切换会十分麻烦。那么要如何在不激活虚拟环境的情况下,直接运行依赖于虚拟环境的程序呢。

其实观察虚拟环境的目录结构之后可以发现,每个虚拟环境都有各自的 /bin 目录,这些程序也都是独立可运行的。例如,在虚拟环境中的默认 python 为:

/home/user/anaconda3/envs/myenv/bin/python

那么用这个路径的python去执行脚本,大多数时候虚拟环境里面的依赖就直接可用。除了python以外,其它安装上去的程序也可以用这个方式运行。

不过有时候也会遇到报错的情况,这是因为activate脚本当中其实还做了环境变量的替换。具体替换了哪些,可以打开activate去查看具体的内容。不过无论是哪种, PATH 是必被替换的。我使用的是conda的虚拟环境,从脚本中能看到, CONDA_PREFIX_CONDA_PACK_OLD_PS1 这两个环境变量也被替换了。根据网上看到的资料,其它虚拟环境,例如python自带的虚拟环境,可能会替换 PYTHONHOMEVIRTUAL_ENV 等变量。

在知道那些变量会被替换之后,在命令前将需要设置的各个环境变量列出来,用空格分隔,最后附上需要执行的命令就可以了,例如:

PATH="/home/user/anaconda3/envs/myenv/bin/" CONDA_PREFIX="/home/user/anaconda3/envs/myenv" somecommand

最后,如果要用这种方法后续接多条命令,组成管道的话,直接用上面的语法,设置的环境变量可能只对第一条命令生效。这种情况可以参考这篇回答,使用如下的方法:

(export FOO=bar; somecommand someargs | somecommand2)