python - 为什么“#!/usr/bin/env PATH=... python”会挂起,在调用 python 时如何指定 PATH?
问题描述
(为了回答而提出问题,最初对此感到困惑。显然欢迎其他答案。)
Using#!/usr/bin/env python
是一种常见的技巧,它允许python
使用查找来找到解释器PATH
,而不是硬编码python
. 调整它以向 中添加PATH=...
参数可能很方便env
,以便硬编码候选目录列表,而不是硬编码单个确切路径。env
(这将利用 locating 时使用指定PATH
变量的事实python
,除了将其传递给 python 进程。)
例如(在test.py
):
#!/usr/bin/env PATH=/opt/python/bin:/usr/bin:/bin python
import sys
print(sys.executable) # show which executable it found
但是如果你尝试这个,虽然如果从 shell 命令行显式执行该命令可以工作:
$ echo $PATH
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ /usr/bin/env PATH=/opt/python/bin:/usr/bin:/bin python ./test.py
/opt/python/bin/python
尝试通过shebang运行它时失败:
$ ./test.py
[hangs - infinite loop]
为什么会这样,可以做些什么呢?
解决方案
关于它失败的原因,事实证明这是这里描述的问题的一个例子。
至于可以做些什么,可以使各种这种解决方法适应类似的问题,即如何将参数传递给python in #!/usr/bin/env python
(虽然它不是完全相同的问题,但也与想要拥有更多shebang 行中的两个项目)。
这给出了:
#!/bin/sh
''''export PATH=/opt/python/bin:/usr/bin:/bin; exec python "$0" # '''
import sys
print(sys.executable)
通过 shebang 调用它,我们得到:
$ ./test.py
/opt/python/bin/python
涉及#!/usr/bin/env -S PATH=... python
(GNU coreutils >= 8.30)的解决方案似乎仍然不够便携(例如 Ubuntu 18.04.4,它是 2020 年 4 月之前的最新 LTS 版本,具有 coreutils 8.28)。
推荐阅读
- arrays - 弄清楚数组是如何排序的
- postgresql - SQL find the oldest date of a book and its author
- css - 当我的应用程序静态提供时,为什么我的关键帧无法正常运行?
- mysql - MYSQL 如何获取一周的开始和结束日期?
- .net-core - 是否可以使用 SignalR 将数据从另一台服务器转发到您的客户端?
- google-chrome - Chrome 显示证书无效/连接不安全
- f# - 如何在 F# 中克隆 Partial 类并更改一个属性
- python - 不能在没有调整大小的情况下使用放大窗口
- python - 烧瓶 sqlalchemy 不使用 mysql 插入外键
- axios - React Native Axios 从 url 错误中获取数据