在pip
计划,她爆炸是
#!/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
子程序。这是正确的吗?
对于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中的桌面文件夹,并注意其报告为“壳”的文件:
(虽然它是作为一个Shell文件错误地报道,这个Python脚本仍然可以通过双击它,执行它不会破坏Finder或任何东西。)
要回答的具体问题,之所以喜欢这种模式可能是,丹D.说,为了避免认领行限制之一。
一般情况下,你会更喜欢使用#!/usr/bin/env python
为您的家当线。创建猛砸Heredoc(即python3.6 << EOF
模式)会创造各种各样的问题,比如你的语法高亮将无法正常工作,你必须注意的Bash变量代换的定界符内,等
在一般情况下,你只是想指定你真正想要的解释。
这个之外,你有时会看到解决方法是这样的便携黑客。在POSIX系统,/usr/bin/env
涵盖了大部分的场景相当不错;但如果你需要移植到旧的或其他特殊系统,回落至最小公分母,然后工作的方式备份到一个地方,你可以可靠地运行例如对各种系统的Python可能需要各种不明显的构造。 (以前 - upvoted - 丹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
' "$@"
存在对#!
线路的线路长度的限制。也许他们这样做是为了绕开这个问题。
该选项是路径的程序,但只有当它是足够短。 env python
使用它使用的路径。或链装载这样的。