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

如何解决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

进入故障环境的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?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?