我主张在虚拟环境中开发/测试应用程序。如何利用一个现有 venv 环境呢, 傻傻的我把其它工程的 venv 目录复制一份,她真的能工作吗?
假设在 dirA 目录下拥有一个叫做 venv 的Python虚拟环境, 进入虚拟环境下
pip list
嗯,正常的显示所有已经安装的库。
现在我想在 ProjA 里面使用 dirA 中 env 环境,并添加其它安装包。将其复制到 ProjA 目录下之后,进入虚拟环境下。
where pip
你会惊奇的发现,最先出现的 pip路径,不是当前虚拟环境的 pip路径,而是 dirA/venv 中的 pip路径。
删除/重命名 dirA/venv目录, 在ProjA/venv的虚拟环境中执行where pip
就只能找到系统的 pip, 那么当前环境的pip跑哪里去了呢?
谷歌/百度一番之后,终于没有任何答案!!!
一定是路径有问题
一次发现,一次喜悦,一次失败
带着疑问,我首先打开 venv\Scripts
下面的一个文件
activate
activate.bat
Activate.ps1
deactivate.bat
别问我为什么是这四个文件, 因为他们是虚拟环境的入口/出口点
VIRTUAL_ENV="D:\CommonUser\Documents\BookCode\Python\PythonCode\dirA\rqalpha-git\rqalpha\env"
路径用的是绝对路径!!!
先改成:
VIRTUAL_ENV="D:\CommonUser\Documents\BookCode\Python\PythonCode\ProjA\rqalpha-git\rqalpha\env"
重新进入ProjA/venv , pip list
Fatal error in launcher: Unable to create process using '"'
好了,出现这个奇怪的错误!!!
搜索失败!放弃!放弃!
搜索一大堆答案,终究是毫不相关的东西,随便pip安装不就好了吗,谁没有网络,谁会去折腾这些呢?想想也是喔, 放弃!
再再次发现尝试,终成功!
之前修改虚拟环境入口/出口都没有问题了,where pip
命令也能找到她了,为什么 pip list
就失败了呢?一定是 pip 程序本身有问题!
通过 winHex 比较系统的 pip和虚拟环境中的pip,果然不一样!
仔细观察,我发现了熟悉的一串字符串,就是那个曾经替换的绝对路径出现在她里面了!
#!d:\commonuser\documents\bookcode\python\pythoncode\dirA\rqalpha-git\rqalpha\env\scripts\python.exe
原来pip会执行时会释放内部的 python代码,并且采用指定的绝对路径的 python.exe,当找不到 python.exe 时导致创建 Python 进程失败,报出诡异错误!
赶紧修改这该死的路径,以此类推,Scripts下的所有 exe 都需要修改路径。
这次手动修改为正确路径之后,重新进入 ProjA/venv, 重新运行 pip list
很好! 成功显示所有虚拟环境的模块。
自此终于解决一直搞不定的问题,分析问题的能力真的很重要,需要不断加强!
作为一个 软件工程师,手动修改多么 Low 啊!分分钟写出一段自动修改的代码。