为什么Linux中的Python需要#!/usr/bin/python这一行?

非常简单的问题:在Linux中,为什么Python需要这一行

#!/usr/bin/python

在python文件的开头,因为Windows没有?

它有什么作用? ‘因为描述“链接到Python”有点模糊……

解决方法:

Python对Linux没有任何这样的特殊要求.它是Unix / Linux上的程序加载器,它使用了“shebang”行,就像它所说的那样.这实际上是一个功能而不是限制,但我们马上就会做到这一点. The Wiki page on “shebang” has more details,但我会尝试在这里给出一个概述以及与Windows的比较.

首先,让我们看看Windows上的情况:

>当您尝试打开或运行文件时,Windows首先检查该文件的扩展名.这是文件名的最后一部分.对于Python文件,这通常是.py.
> Windows根据文件扩展名查找要执行的操作.

>此信息记录在Windows注册表中;安装Python时,它通常告诉Windows应该使用新安装的应用程序Python(即Python解释器)打开.py文件.
>多种文件类型具有内置行为;例如,可执行文件(例如Python解释器本身)必须以.exe结尾,而.bat文件则作为Windows批处理脚本执行.
>对特定文件类型采取的操作是可自定义的.例如,您可以告诉Windows使用python.exe运行.py文件,而不是使用其他程序打开它们,例如文本编辑器notepad.exe.

>在这种情况下,为了运行Python脚本,您需要手动调用python< scriptname> .py(或写一个.bat文件来为您执行此操作).

现在,如果在Python脚本的顶部有一个shebang行(#!/usr/bin/python或#!/usr/bin/env python)会发生什么?好吧,因为#是Python中的注释行,Python解释器只是忽略它.这就是为什么Unix / Linux世界中使用的大多数脚本语言使用#来启动注释行的原因之一.

所以说Windows“不需要”#有点误导!线; Windows没有看到#! line,实际上依赖于文件扩展名来告诉它该怎么做.这有几个缺点:

>您必须在末尾使用.py命名Python脚本,以便自动识别它们.
>没有简单的方法可以区分Python2脚本和Python3脚本.
>如前所述,如果更改.py文件类型的默认启动行为,Windows将不再使用Python自动运行这些脚本.请注意,这可能是无意中完成的.

现在,让我们看看Unix / Linux如何启动脚本:

首先要注意的是,与Windows不同,Unix / Linux不是试图使用特定程序“打开”Python脚本,至少在概念上是这样;操作系统知道脚本是可以执行的,因为称为“执行位”(这超出了本答案的范围).因此,如果您不小心键入#!/usr/bin/pthon而不是#!/usr/bin/python,您将收到包含此文本的错误消息:

/usr/bin/pthon: bad interpreter: No such file or directory.

“解释器”这个词给了我们一个关于shebang线的作用的线索(虽然从技术上来说,指定的程序可以是解释器之外的其他东西,例如cat或文本编辑器).当您尝试执行文件时,会发生以下情况:

> Unix / Linux程序加载器查看该文件的前两个字节;如果这两个字节是#!,则加载程序将shebang行的其余部分(不包括shebang本身)解释为启动解释器的命令,使用该解释器将文件内容作为脚本运行.
>程序加载器启动指定的解释器,将原始文件的路径作为参数提供.

这有几个好处:

>脚本编写者可以更好地控制将使用哪个解释器(这解决了Python2 / Python3问题),并且有时可以将额外的参数传递给解释器(有关详细信息,请参阅Wiki页面).
>忽略脚本的文件名,因此您可以根据需要命名Python脚本.

最后,请注意,Unix / Linux不需要shebang行来运行Python脚本.回想一下,所有shebang行实际上都允许程序加载器选择一个解释器.但就像在Windows中一样,这可以手动完成:

python <myscript>
上一篇:为什么有些python脚本以#!/usr/bin/env python开头?


下一篇:Bash脚本不从crontab执行[复制]