Python脚本中用来启动工具的shebang从哪里来?

5
几个广泛使用的Python工具,如pipyolkipython,是通过带有shebang的脚本启动的,指定要使用哪个Python实例来运行它们。这一行的内容是如何确定的?
例如,在我使用苹果的Python的OS X机器上,这一行的内容如下:
#!/usr/bin/python

如果我安装放在 python.org 网站上的版本会发生什么呢?
/Library/Frameworks/Python.framework/Versions/2.7/python 

在这里有一个符号链接:

/usr/local/bin/python

如果我更新或重新安装一个工具,会发生什么?如果我更新了一个工具,那么这行代码会改变吗?为了强制更改,我是否必须完全重新安装(而不仅仅是更新)每个工具?这行代码会变成什么?会是下面的形式:

#!/usr/local/bin

或者
#!/Library/Frameworks/Python.framework/Versions/2.7

有没有一种方法可以实现这个?
#!/usr/bin/env python

我认为你指的是 #!/usr/local/bin/python 而不仅仅是上面的 #!/usr/local/bin - Joe
@Joe:正确。已修复。 - orome
1个回答

3
该行代码来自于 sys.executable
如果您将 python 可执行文件建立符号链接,并从该符号链接运行 Python,则 sys.executable 将使用新路径。更新或重新安装工具将反映更改后的可执行文件路径。
我不知道有任何方法可以让 pip 和其他工具使用 #!/usr/bin/env python。这真的是一个坏主意,因为这会使得正确使用 Python 变得更加困难,而正确使用 Python 是为了能够找到已安装的包以运行命令行脚本。

当运行pip进行升级或重新安装时,并且使用由shebang指示的/usr/local/bin,那么该调用pipsys.executable值是/usr/local/bin还是将在命令提示符下运行的Python路径(即由which返回的Python)? - orome
1
@raxacoricofallapatorius:pip本身就是一个命令行工具,因此它也有一个shebang行。您需要先更新行,或者使用所选的Python解释器运行pip/usr/local/bin/python /path/to/pip/script/pip.py)。 - Martijn Pieters
那么实际上,如果我有一个带有给定 shebang 的 pip 并且只是在命令行上“裸奔”运行它,它(以及我使用过去版本的 Python 安装的所有工具)将继续使用那个(旧)版本?但是一旦我运行 pip 以使用显式版本的 Python 更新自身(一次)(如上面的评论中所述或通过编辑脚本来执行此操作),pip 的所有后续工具更新也会修复它们的 shebangs 吗? - orome
@raxacoricofallapatorius:没错。然后Python将以新路径启动,这就成为了sys.executable - Martijn Pieters
请问(只是为了确认),是否只需要运行一次sudo /path_to/correct_version pip install -U pip,就可以让pip在所有后续运行中使用“correct_version”(即更改pip.py中的shebang),以便随后的sudo pip install -U package将更改“package”的shebang,还是需要更多步骤? - orome
我也是!我本来要接受的。我还没有测试过,但它听起来肯定是对的。 - orome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接