问题描述
我有一个运行Catalina 10.15.6的Macbook Pro。
我在python venv
环境失败方面一直遇到问题。
当我启动python项目时,我在项目目录中运行它:
python3 -m venv .
这将创建环境。我用. bin/activate
激活了环境,运行which python3
给了我这样的东西:
/Users/qotsa42/Projects/web/project_name/bin/python3
换句话说,它使用虚拟环境中的python二进制文件。一切都很好。
我的计算机上有几十个完全按照这种方式创建的项目。有时,出于没有明显原因且没有明显模式的情况,激活脚本不再加载python二进制文件。
例如,我刚刚尝试为几个月没有接触的项目激活环境。 which pip3
给了我这个:
/Users/qotsa42/Projects/web/project_name/bin/pip3
但是which python3
给了我这个:
/usr/local/bin/python3
我终生无法弄清是什么原因阻止了虚拟环境加载正确的python二进制文件。
在这个特定的项目中,我使我的main.py
文件可执行,并在顶部将bash shebang指向虚拟环境的二进制文件。当我运行脚本时,它给了我这个:
/Users/qotsa42/Projects/web/project_name/bin/python3: bad interpreter: No such file or directory
进入故障环境的bin
目录并执行ls -la
可以使我做到这一点:
total 64
drwxr-xr-x 13 qotsa42 DOMAIN\Domain Users 416B Jul 23 13:54 ./
drwxr-xr-x 15 qotsa42 DOMAIN\Domain Users 480B Sep 16 12:41 ../
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 2.2K Jul 23 13:54 activate
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 1.3K Jul 23 13:54 activate.csh
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 2.4K Jul 23 13:54 activate.fish
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 269B Jul 23 13:54 easy_install*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 269B Jul 23 13:54 easy_install-3.7*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 260B Jul 23 13:54 piP*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 260B Jul 23 13:54 pip3*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 260B Jul 23 13:54 pip3.7*
lrwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 9B Jul 23 13:54 python@ -> python3.7
lrwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 9B Jul 23 13:54 python3@ -> python3.7
lrwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 35B Jul 23 13:54 python3.7@ -> /usr/local/opt/python/bin/python3.7
现在,在虚拟环境仍然起作用的项目上,这是相同的ls -la
命令:
total 136
drwxr-xr-x 19 qotsa42 DOMAIN\Domain Users 608B Sep 14 14:53 ./
drwxr-xr-x 13 qotsa42 DOMAIN\Domain Users 416B Sep 14 15:15 ../
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 8.6K Aug 31 12:00 Activate.ps1
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 2.2K Aug 31 12:00 activate
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 1.3K Aug 31 12:00 activate.csh
-rw-r--r-- 1 qotsa42 DOMAIN\Domain Users 2.4K Aug 31 12:00 activate.fish
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 260B Sep 14 14:53 black*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 255B Sep 14 14:53 black-primer*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 261B Sep 14 14:53 blackd*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 270B Aug 31 12:00 easy_install*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 270B Aug 31 12:00 easy_install-3.8*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 256B Aug 31 12:01 f2py*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 256B Aug 31 12:01 f2py3*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 256B Aug 31 12:01 f2py3.8*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 261B Aug 31 12:01 piP*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 261B Aug 31 12:01 pip3*
-rwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 261B Aug 31 12:01 pip3.8*
lrwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 7B Aug 31 12:00 python@ -> python3
lrwxr-xr-x 1 qotsa42 DOMAIN\Domain Users 22B Aug 31 12:00 python3@ -> /usr/local/bin/python3
对OS或Brew升级的升级有可能破坏了我所有的虚拟环境,我现在才注意到,但这在我看来是可疑的。我先感谢您的帮助。
ALSO:过去,删除所有环境文件/目录并重新安装虚拟环境已解决了此问题,但我宁愿不处理所有可能的问题。
看来问题出在python二进制文件的simlinks中。 python3.7
目录中没有/usr/local/opt/python/bin
二进制文件,但是有python3.8
个二进制文件。
运行/usr/local/opt/python/bin/python3.8 ./main.py
可以运行,但是不会加载通过pip3
安装的模块,即我
ModuleNotFoundError: No module named 'pyodbc'
运行python3 -m venv --upgrade .
输出:
Error: [Errno 2] No such file or directory: '/Users/qotsa42/Projects/web/import_csv/bin/python3'
解决方法
您的激活脚本是什么样的?主要目的是在PATH的开头插入Python。
这是我的:
VIRTUAL_ENV="/Users/myuser/kds2/py2/venv38"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
在运行activate
之前,我在PATH中有此文件(我使用实用程序将其逐行拆分):
0 /Users/myuser/.cargo/bin
1 /Users/myuser/.nvm/versions/node/v10.15.0/bin
2 /opt/local/bin
激活后
0 /Users/myuser/kds2/py2/venv38/bin
1 /Users/myuser/.cargo/bin
2 /Users/myuser/.nvm/versions/node/v10.15.0/bin
因此,基本上,它所做的全部工作都以$VIRTUAL_ENV/bin
为前缀
我建议您稍微看一下激活,然后尝试看看它的作用。 $ VIRTUAL_ENV可能有什么问题吗?它确实已硬编码到激活位置。
printf "\n$VIRTUALENV:$VIRTUALENV:\n"
可能会为您提供线索。
VIRTUALENV=$(fnp $BASH_SOURCE/../..)
可以像编织一样完成技巧,
现在,接下来的事情是您的实际目录是什么样的:
如果我在该venv上方cd
,我将具有以下树结构:
tree -d -L 2 venv
venv
├── bin
│ └── __pycache__
├── cx_Oracle-doc
├── include
├── lib
│ └── python3.6
├── man
│ └── man1
└── share
├── doc
├── jupyter
└── man
现在,您的可能有所不同。 3.6可能是我剩下的。但是这里有一个目录结构,里面充满了文件。
将cd
放到垃圾箱中,即激活后我的第一个PATH条目
和ls -l python
(venv38) myuser@bin$ ls -l python
lrwxr-xr-x 1 myuser staff 9 May 29 13:15 python -> python3.8
这只是使其版本中立。
让我们ls -l python3.8
lrwxr-xr-x 1 myuser staff 73 May 29 13:15 python3.8 -> /opt/local/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8
这是macports放置Python的地方。如果您使用的是brew,则应该在/usr/local/
之类的位置(我认为)。
是的,我可以启动它:
(venv38) myuser@bin$ python3.8
Python 3.8.1 (default,Jan 5 2020,21:32:35)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help","copyright","credits" or "license" for more information.
现在,其中任何一个都可能会失败,但是需要通过步骤来验证正在发生的事情:
- 已设置路径
- venv / bin内容 在venv / bin中指向
- 实际的Python
然后,您可以推断出问题的原因。
,如果您想知道的是3.7 vs 3.8,也许您可以仅通过rm python
然后ln -s /usr/local/opt/python/bin/python3.8 python
进行修复。
,但是在执行此操作之前,请看一下python的时间戳,大概是3.7。 symlink包含创建链接的时间。会打铃吗?您在那个时候安装了什么东西吗?也许与点子有关?
现在,我已经将Python 3.6 / 3.7 / 3.8并存,并且几乎没有问题。但是,如果可以的话,也许可以考虑对1个版本进行标准化,除非您稳定了venv?