#!/ bin / sh与#!/ usr / local / bin / python在可执行文件中的

时间:2019-02-03 02:52:12

标签: python bash shell shebang

pip程序中,She-bang是

#!/usr/local/bin/python

if __name__ == "__main__":
    # Python program body

在Python启动器提供的Install Certificates.command中:

#!/bin/sh

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 << "EOF"

# python program body

EOF

这两种方法之间有什么区别吗?并且有什么理由要优先于另一个吗?

在我看来,它们都是一样的,除了第二个还有一个bash子例程。是这样吗?

3 个答案:

答案 0 :(得分:3)

在一般情况下,您只需要指定实际需要的解释器即可。

除此之外,您有时还会将诸如此类的变通办法视为可移植性黑客。在POSIX系统上,/usr/bin/env很好地涵盖了大多数情况;但是如果您需要移植到较旧的系统或其他特殊系统上,请退回到最低的公分母,然后再返回到可以可靠运行的地方,例如各种系统上的Python可能需要各种不明显的构造。 (上一个-赞成!-Dan D.的回答是一个很好的例子。)

在某些情况下,您还希望sh进行设置(例如,获取使用sh语法的文件中指定的一些环境变量),然后hand over execution进行设置Python;

#!/bin/sh
# source some variables
. /etc/defaults/myenv.sh
# Then run Python
exec env python -c '
# ... Your Python script here
    ' "$@"

答案 1 :(得分:2)

#!行有行长限制。也许他们这样做是为了解决这个问题。

这些选项是程序的路径,但前提是足够短。使用env python来使用路径。或像这样链式装载。

答案 2 :(得分:2)

Install Certificates.command脚本的特定代码是在Python Issue #17128中引入的。据我所知,作者尚未解释为什么他以这种方式编写代码。

请注意,.command文件是Mac OS X上的Shell脚本,可以通过在Finder中双击来执行它们。

我相信可能的解释是,作者只是想兑现Mac OS X对.command文件应为Shell脚本的期望。

您可以通过将以下内容放入文件~/Desktop/test.command中进行测试:

#!/usr/bin/env python
print "Hello world"

然后在Finder中查看Desktop文件夹,并注意将其报告为“外壳”文件:

enter image description here

(尽管它被错误地报告为Shell文件,但仍然可以通过双击该Python脚本来执行它。它不会破坏Finder或任何东西。)

要回答这个特定问题,更喜欢这种模式的一个原因可能是,如Dan D.所说,避免了Shebang行数限制。

通常,您希望使用#!/usr/bin/env python作为Shebang行。创建Bash Heredoc(即python3.6 << EOF模式)会产生各种各样的问题,例如语法高亮将不起作用,您必须注意Heredoc中的Bash变量插值,等等。