使用 /usr/bin/env python3 指向 22.04 中的虚拟环境

使用 /usr/bin/env python3 指向 22.04 中的虚拟环境

我有一个以以下内容开头的脚本

#!/usr/bin/env python3

它是否应该使用“python3”虚拟环境并必须明确激活它?我很确定这在以前版本的 Ubuntu 上曾经有效。

我正在从 crontab 调用脚本,但是它找不到 Python 依赖项(肯定已安装)。

57 10 * * * root /opt/cleanup.py >> /var/log/cleanup.log

Traceback (most recent call last):
  File "/opt/cleanup.py", line 3, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'

我的依赖项:

(python3) root@ip[prod]:/opt/virtualenv/python3$ pip list
Package            Version
------------------ ---------
boto3              1.26.8
botocore           1.29.8
certifi            2022.12.7
charset-normalizer 2.1.1
idna               3.4
jmespath           1.0.1
pip                23.0.1
python-dateutil    2.8.2
requests           2.28.1
s3transfer         0.6.0
setuptools         59.6.0
six                1.16.0
urllib3            1.26.12
wheel              0.37.1

剧本cleanup.py

#!/usr/bin/env python3
import requests
import boto3
import sys
import urllib3
import time

我在使用 Ubuntu 22.04.1 LTS。

答案1

/usr/bin/env python3运行时,您不应该依赖于指向相同的路径/环境root或任何其他不同的用户)... 在您的用户下,通常它会首先查看,/home/user/.local/bin而在下root,它通常不会... 查看与例如的区别:

# For your user … "ubuntu" is my test user
$ echo "$PATH"
/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin

# For "root"
$ sudo su root -c 'echo "$PATH"'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

并且您明确要求以如下cron方式运行脚本root

57 10 * * * root /opt/cleanup.py >> /var/log/cleanup.log

/usr/bin/env实际上是一个命令/可执行文件(不要与 Python 虚拟环境混合)...它根据调用用户的搜索路径找到传递的可执行文件...因此,如上root例所示,/usr/bin/env python3实际上将转换为/usr/bin/python3至于解释传递的可执行路径的部分) 作为搜索路径中的第一个匹配项。

你可以查看并测试你的 shebang 在运行时将调用哪个 Python 环境,例如root

sudo su root -c '/usr/bin/env python3'

事实上,激活 Python 虚拟环境的一部分是修改默认用户的路径,使其以虚拟环境本身的路径开头,即在文件中venv/bin/activate包含以下内容:

VIRTUAL_ENV='/full/path/to/venv'
export VIRTUAL_ENV
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

但是,不建议仅仅为了在某个 Python 虚拟环境中运行某些 Python 脚本文件而手动修改默认用户的路径/环境,因为这可能会导致其他脚本/应用程序出现问题,甚至导致它们无法使用,并且可能会破坏您的系统...您可以通过将脚本中的 shebang 设置为您想要的虚拟环境中的 Python 可执行文件的路径来简单地做到这一点,例如:

#!/opt/virtualenv/python3

在这种情况下,无需在使用虚拟环境之前激活它...请参阅:venvs 的工作原理

并且,为了验证,您可以列出该虚拟环境中已安装的模块,例如:

/opt/virtualenv/python3 -m pip list

可能还值得注意的是,该/opt目录是为 Linux 的附加应用软件包保留/使用的。FHS(文件系统层次标准...因此,为了获得良好的实践,您可能需要遵守这一点。

相关内容