我有 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。