为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

萧十郎 2023-08-15 16:39:04
我有一台运行 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'
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

你的激活脚本是什么样的?它的主要目的是在 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/../..)同样可以做到这一点,


现在,接下来是你的实际目录是什么样的:


如果我在cdvenv 的正上方,我有这样的树结构:


tree -d -L 2 venv


venv

├── 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 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 内容

  • 实际的 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 稳定了?


查看完整回答
反对 回复 2023-08-15
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信