如何解决为什么“#!/ usr / bin / env PATH = ... python”挂起,以及在调用python时还能如何指定PATH?
(为answer it提问,最初对此感到困惑。显然,其他答案也很受欢迎。)
使用#!/usr/bin/env python
是一种常见的技巧,它允许使用python
查找来找到PATH
解释器,而不是硬编码到python
的路径。对其进行适应以在PATH=...
上添加env
参数可能很方便,以便在不对单个确切路径进行硬编码的情况下对候选目录列表进行硬编码。 (这将利用env
在定位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]
这是为什么,什么可以代替呢?
解决方法
关于失败的原因,事实证明这是here中描述的问题的一个示例。
关于可以采取的措施,可以使各种this workaround适应类似的问题,即如何在#!/usr/bin/env python
中将参数传递给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)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。