Python venv 项目随机停止找到 python3 二进制文件
Python venv projects randomly stop being able to find python3 binary
我有一台 macbook pro 运行ning Catalina 10.15.6.
我一直遇到 python venv
环境失败的问题。
当我启动一个 python 项目时,我 运行 在项目目录中这样做:
python3 -m venv .
这就创造了环境。我用 . bin/activate
激活环境, 运行ning 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 升级可能破坏了我所有的虚拟环境,我现在才注意到,但这对我来说似乎很可疑。我提前感谢任何帮助。
另外:删除所有环境 files/directories 并重新安装虚拟环境在过去解决了这个问题,但我宁愿尽可能不处理所有这些问题。
看来问题出在 python 二进制文件的模拟链接中。 /usr/local/opt/python/bin
目录中没有 python3.7
二进制文件,但是有一个 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
所以,基本上,它所做的一切都是在 PATH 前面加上 $VIRTUAL_ENV/bin
我建议您看一下激活并尝试查看它的作用。 $VIRTUAL_ENV 有什么问题吗?它真的硬编码到激活位置。
printf "\n$VIRTUALENV:$VIRTUALENV:\n"
可能会给您一些线索。
VIRTUALENV=$(fnp $BASH_SOURCE/../..)
也一样,
现在,接下来是您的实际目录是什么样的:
如果我 cd
在那个 venv 的正上方,我有这个树结构:
tree -d -L 2 venv
venv
├── bin
│ └── __pycache__
├── cx_Oracle-doc
├── include
├── lib
│ └── python3.6
├── man
│ └── man1
└── share
├── doc
├── jupyter
└── man
现在,您的可能有所不同。 3.6 可能是我剩下的。但是有一个目录结构,里面全是文件。
让我们 cd
进入垃圾箱,即我在 activate-ion
之后的第一个 PATH 条目
和ls -l python
(venv38) myuser@bin$ ls -l python
lrwxr-xr-x 1 myuser staff 9 May 29 13:15 python -> python3.8
那只是为了version-neutral。
让我们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 内容
- 实际 Python 指向 venv/bin
然后你就可以推断出问题的原因了。
而且,如果你想知道的是 3.7 还是 3.8 项目,也许你可以通过 rm python
然后 ln -s /usr/local/opt/python/bin/python3.8 python
.
来解决
但在此之前,请查看 python 的时间戳,大概指向 3.7。 symlink 包含创建 link 的时间。这会敲响警钟吗?那个时候你安装了什么东西吗?也许与 pip 有关?
现在,我已经 Python 3.6/3.7/3.8 共存了,几乎没有问题。但是,如果可以的话,也许可以考虑在 1 个版本上进行标准化,除非你让你的 venv 稳定下来?
我有一台 macbook pro 运行ning Catalina 10.15.6.
我一直遇到 python venv
环境失败的问题。
当我启动一个 python 项目时,我 运行 在项目目录中这样做:
python3 -m venv .
这就创造了环境。我用 . bin/activate
激活环境, 运行ning 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 升级可能破坏了我所有的虚拟环境,我现在才注意到,但这对我来说似乎很可疑。我提前感谢任何帮助。
另外:删除所有环境 files/directories 并重新安装虚拟环境在过去解决了这个问题,但我宁愿尽可能不处理所有这些问题。
看来问题出在 python 二进制文件的模拟链接中。 /usr/local/opt/python/bin
目录中没有 python3.7
二进制文件,但是有一个 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
所以,基本上,它所做的一切都是在 PATH 前面加上 $VIRTUAL_ENV/bin
我建议您看一下激活并尝试查看它的作用。 $VIRTUAL_ENV 有什么问题吗?它真的硬编码到激活位置。
printf "\n$VIRTUALENV:$VIRTUALENV:\n"
可能会给您一些线索。
VIRTUALENV=$(fnp $BASH_SOURCE/../..)
也一样,
现在,接下来是您的实际目录是什么样的:
如果我 cd
在那个 venv 的正上方,我有这个树结构:
tree -d -L 2 venv
venv
├── bin
│ └── __pycache__
├── cx_Oracle-doc
├── include
├── lib
│ └── python3.6
├── man
│ └── man1
└── share
├── doc
├── jupyter
└── man
现在,您的可能有所不同。 3.6 可能是我剩下的。但是有一个目录结构,里面全是文件。
让我们 cd
进入垃圾箱,即我在 activate-ion
和ls -l python
(venv38) myuser@bin$ ls -l python
lrwxr-xr-x 1 myuser staff 9 May 29 13:15 python -> python3.8
那只是为了version-neutral。
让我们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 内容
- 实际 Python 指向 venv/bin
然后你就可以推断出问题的原因了。
而且,如果你想知道的是 3.7 还是 3.8 项目,也许你可以通过 rm python
然后 ln -s /usr/local/opt/python/bin/python3.8 python
.
但在此之前,请查看 python 的时间戳,大概指向 3.7。 symlink 包含创建 link 的时间。这会敲响警钟吗?那个时候你安装了什么东西吗?也许与 pip 有关?
现在,我已经 Python 3.6/3.7/3.8 共存了,几乎没有问题。但是,如果可以的话,也许可以考虑在 1 个版本上进行标准化,除非你让你的 venv 稳定下来?