#!/ bin / sh的VS#!的/ usr / local / bin目录/可执行文件中的Python

问题描述 投票:1回答:3

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子程序。这是正确的吗?

python bash shell shebang
3个回答
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中的桌面文件夹,并注意其报告为“壳”的文件:

enter image description here

(虽然它是作为一个Shell文件错误地报道,这个Python脚本仍然可以通过双击它,执行它不会破坏Finder或任何东西。)

要回答的具体问题,之所以喜欢这种模式可能是,丹D.说,为了避免认领行限制之一。

一般情况下,你会更喜欢使用#!/usr/bin/env python为您的家当线。创建猛砸Heredoc(即python3.6 << EOF模式)会创造各种各样的问题,比如你的语法高亮将无法正常工作,你必须注意的Bash变量代换的定界符内,等


3
投票

在一般情况下,你只是想指定你真正想要的解释。

这个之外,你有时会看到解决方法是这样的便携黑客。在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
    ' "$@"

2
投票

存在对#!线路的线路长度的限制。也许他们这样做是为了绕开这个问题。

该选项是路径的程序,但只有当它是足够短。 env python使用它使用的路径。或链装载这样的。

© www.soinside.com 2019 - 2024. All rights reserved.