首页 > 解决方案 > 为什么“#!/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]

为什么会这样,可以做些什么呢?

标签: pythonlinuxcommand-line-argumentsshebang

解决方案


关于它失败的原因,事实证明这是这里描述的问题的一个例子。

至于可以做些什么,可以使各种这种解决方法适应类似的问题,即如何将参数传递给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)。


推荐阅读