#!/垃圾箱/垃圾箱vs#/可执行文件中的usr/local/bin/python
在#!/垃圾箱/垃圾箱vs#/可执行文件中的usr/local/bin/python,python,bash,shell,shebang,Python,Bash,Shell,Shebang,在pip程序中,She-bang是 #!/usr/local/bin/python if __name__ == "__main__": # Python program body 在Python启动器提供的安装Certificates.command中: #/垃圾箱/垃圾箱 /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6在上有一个行长度限制行。也许他们这样做是为了逃避现实 选项是指向程序的路径,但仅当它
pip
程序中,She-bang是
#!/usr/local/bin/python
if __name__ == "__main__":
# Python program body
在Python启动器提供的安装Certificates.command
中:
#/垃圾箱/垃圾箱
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6在上有一个行长度限制代码>行。也许他们这样做是为了逃避现实
选项是指向程序的路径,但仅当它足够短时。使用使用路径的env python
。或者像这样的链式装载。在#上有一个行长度限制代码>行。也许他们这样做是为了逃避现实
选项是指向程序的路径,但仅当它足够短时。使用使用路径的env python
。或者像这样的链式加载。在一般情况下,您只需指定实际需要的解释器
除此之外,您有时会将这种变通方法视为可移植性问题。在POSIX系统上,/usr/bin/env
很好地涵盖了大多数场景;但是,如果您需要可移植到较旧的或其他特殊的系统,那么回到最低公分母,然后逐步恢复到可以可靠运行的位置,例如Python在各种系统上可能需要各种不明显的构造。(丹D.的回答是一个很好的例子。)
也有一些情况下,您希望sh
设置一些内容(例如,获取在使用sh
语法的文件中指定的一些环境变量),然后设置Python
#!/bin/sh
# source some variables
. /etc/defaults/myenv.sh
# Then run Python
exec env python -c '
# ... Your Python script here
' "$@"
在一般情况下,您只需要指定实际需要的解释器
除此之外,您有时会将这种变通方法视为可移植性问题。在POSIX系统上,/usr/bin/env
很好地涵盖了大多数场景;但是,如果您需要可移植到较旧的或其他特殊的系统,那么回到最低公分母,然后逐步恢复到可以可靠运行的位置,例如Python在各种系统上可能需要各种不明显的构造。(丹D.的回答是一个很好的例子。)
也有一些情况下,您希望sh
设置一些内容(例如,获取在使用sh
语法的文件中指定的一些环境变量),然后设置Python
#!/bin/sh
# source some variables
. /etc/defaults/myenv.sh
# Then run Python
exec env python -c '
# ... Your Python script here
' "$@"
Python中引入了安装Certificates.command
脚本的特定代码。据我所知,作者还没有解释他为什么这样写代码
请注意,.command
文件是Mac OS X上的Shell脚本,可以通过在Finder中双击它们来执行
我相信可能的解释是,作者只是想尊重MacOSX的期望,.command
文件应该是Shell脚本
您可以通过将以下内容放在文件~/Desktop/test.command
中进行测试:
#!/usr/bin/env python
print "Hello world"
然后在Finder中查看桌面文件夹,注意它报告为“shell”文件:
(虽然它被错误地报告为Shell文件,但这个Python脚本仍然可以通过双击来执行。它不会破坏Finder或任何东西。)
为了回答这个特定的问题,选择这种模式的一个原因可能是,正如Dan D.所说,为了避免Shebang线限制
通常,您更愿意使用#/usr/bin/env python
作为您的Shebang行。创建Bash(即python3.6此Install Certificates.command
脚本的特定代码是在Python中引入的。据我所知,作者没有解释他为什么以这种方式编写代码
请注意,.command
文件是Mac OS X上的Shell脚本,可以通过在Finder中双击它们来执行
我相信可能的解释是,作者只是想尊重MacOSX的期望,.command
文件应该是Shell脚本
您可以通过将以下内容放在文件~/Desktop/test.command
中进行测试:
#!/usr/bin/env python
print "Hello world"
然后在Finder中查看桌面文件夹,注意它报告为“shell”文件:
(虽然它被错误地报告为Shell文件,但这个Python脚本仍然可以通过双击来执行。它不会破坏Finder或任何东西。)
为了回答这个特定的问题,选择这种模式的一个原因可能是,正如Dan D.所说,为了避免Shebang线限制
通常,您更愿意使用#!/usr/bin/env python
作为Shebang行。创建Bash(也就是说,python3.6你确定吗?我刚刚测试了它,发现Mac OS X上shebang的行限制是511个字符。它是127个字符。但它们都不接近这两个限制。@Alexarvey我不能。我们不知道路径中的省略号有多长。但可能该文件的作者认为限制要低得多,并确实如此。)在使用变通方法之前,不必费心测试。或者,在某些需要支持的系统上,Python的真正路径可能更长。一个“一刀切”的解决方案解决方案将更易于调试、维护和记录。我的MBP上有多个pip版本,我能找到的较长版本是#!/Library/Frameworks/Python.framework/versions/3.6/bin/python3.6
,它已经很长了。但它只有65个字符。即使行限制是127,也很难达到双t这条路径的长度。这是在用python 3.6安装pip时默认设置的。所以我不知道这是否是原因。@tripleee,仅供参考源代码参考是和。这段代码似乎只存在于制作Mac OS X DMG软件包的过程中。我猜正如建议的,作者只是不知道shebang行限制是什么?令人费解的代码!你确定吗?我刚刚测试了一下,发现Mac OS X上shebang的行限制是511个字符,是127个