在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
子例程。是这样吗?
答案 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文件夹,并注意将其报告为“外壳”文件:
(尽管它被错误地报告为Shell文件,但仍然可以通过双击该Python脚本来执行它。它不会破坏Finder或任何东西。)
要回答这个特定问题,更喜欢这种模式的一个原因可能是,如Dan D.所说,避免了Shebang行数限制。
通常,您希望使用#!/usr/bin/env python
作为Shebang行。创建Bash Heredoc(即python3.6 << EOF
模式)会产生各种各样的问题,例如语法高亮将不起作用,您必须注意Heredoc中的Bash变量插值,等等。