Python venv 项目随机停止能够找到 python3 二进制文件

我有一台运行 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

操作系统升级或 Brew 升级可能会破坏我所有的虚拟环境,我现在才注意到,但这对我来说似乎很可疑。我感谢您提前提供的任何帮助。

另外:删除所有环境文件/目录并重新安装虚拟环境已经解决了这个问题,但如果可能的话,我宁愿不处理所有这些问题。

问题似乎出在 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'


萧十郎
浏览 66回答 1
1回答

烙印99

你的激活脚本是什么样的?它的主要目的是在 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/bin1 /Users/myuser/.nvm/versions/node/v10.15.0/bin2 /opt/local/bin激活后0 /Users/myuser/kds2/py2/venv38/bin1 /Users/myuser/.cargo/bin2 /Users/myuser/.nvm/versions/node/v10.15.0/bin所以,基本上,它所做的一切都是在 PATH 上加上前缀$VIRTUAL_ENV/bin我建议你看一下激活并尝试看看它的作用。$VIRTUAL_ENV 有什么问题吗?它确实被硬编码到激活位置。printf "\n$VIRTUALENV:$VIRTUALENV:\n"可能会给你一个线索,了解正在发生的事情。VIRTUALENV=$(fnp $BASH_SOURCE/../..)同样可以做到这一点,现在,接下来是你的实际目录是什么样的:如果我在cdvenv 的正上方,我有这样的树结构:tree -d -L 2 venvvenv├── bin│   └── __pycache__├── cx_Oracle-doc├── include├── lib│   └── python3.6├── man│   └── man1└── share    ├── doc    ├── jupyter    └── man现在,你的可能会有所不同。3.6可能是我的剩余。但有一个目录结构,里面充满了文件。让我们cd进入 bin,即 activate-ion 之后我的第一个 PATH 条目和ls -l python(venv38) myuser@bin$ ls -l pythonlrwxr-xr-x  1 myuser  staff  9 May 29 13:15 python -> python3.8这只是为了使其与版本无关。让我们ls -l python3.8lrwxr-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.8Python 3.8.1 (default, Jan  5 2020, 21:32:35)[Clang 10.0.1 (clang-1001.0.46.4)] on darwinType "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。符号链接带有链接创建的时间。这敲响了警钟吗?你当时安装了什么东西吗?也许与点有关?现在,我已经让 Python 3.6/3.7/3.8 共存了,基本上没有问题。但如果可以的话,也许可以考虑标准化 1 个版本,除非你的 venv 稳定了?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python