![使用 /usr/bin/env python3 指向 22.04 中的虚拟环境](https://linux22.com/image/1193438/%E4%BD%BF%E7%94%A8%20%2Fusr%2Fbin%2Fenv%20python3%20%E6%8C%87%E5%90%91%2022.04%20%E4%B8%AD%E7%9A%84%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83.png)
我有一个以以下内容开头的脚本
#!/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(文件系统层次标准)...因此,为了获得良好的实践,您可能需要遵守这一点。