为什么事情的第二部分有优先权?

为什么事情的第二部分有优先权?

我有 python 脚本在python与默认可执行文件不同的可执行文件下运行。

/usr/bin我在和 中都有 python 可执行文件/mydir/mybins

如果我跑步,我会得到:

$which python
/usr/bin/python

如果运行run.py

# cat run.py
#!/usr/bin/env /mydir/mybins/python

import os
import sys

print(u"Python executable: %s" % sys.executable)
print(u"From within Python PATH=%s" % os.environ[u"PATH"])

我明白了

# ./run.py
Python executable: /mydir/mybins/python
From within Python PATH=/usr/bin:... (and no /mydir/mybins)

为什么?这是设计使然吗?如何/usr/bin/python在不更改代码的情况下使用它?

答案1

env实用程序会将其参数作为命令执行。

如果参数是不是给定一个路径,如 中env python,该命令将在 中查找$PATH。这通常是您在脚本的 -lineenv中使用时想要的。#!

如果论证给定路径,它将在该路径执行命令。

在您的#!-line 中,您执行特定的 Python 解释器。永远不会$PATH被搜索。你可能也有过

#!/mydir/mybins/python

因为该env位实际上什么也没做。

为了让效果$PATH发挥作用,请使用

#!/usr/bin/env python

然后将使用python在中找到的第一个可执行文件。$PATH

#!另一种方法是通过在命令行上使用显式解释器执行脚本来完全绕过-line:

$ python run.py

或者,

$ /usr/bin/python run.py

答案2

正如 Kusalananda 所说,您专门告诉您的脚本使用/mydir/mybins/python.您想知道如何/usr/bin/python在不更改专门指向不同 python 的代码的情况下使用它吗?

您可以通过删除并在其位置/mydir/mybins/python创建符号链接来实现此目的。/usr/bin/python强烈地不建议这样做,但建议您更改脚本中的 hashbang。

相关内容