#!/usr/bin/python
在Python文件的开头,因为Windows不支持?
它是做什么的?因为“链接到Python”这个描述有点模糊...
Python在Linux上没有任何特殊要求。它是Unix/Linux上的程序加载器使用所谓的"shebang"行。这实际上是一种特性而不是限制,但我们稍后会详细介绍。关于"shebang"的维基页面有更多细节,但我也会在这里概述并与Windows进行比较。
首先,让我们看看Windows上的情况:
当您尝试打开或运行一个文件时,Windows首先会检查该文件的扩展名。这是文件名的最后一部分,以.
开头。对于Python文件来说,通常是.py
。.py
文件。.exe
结尾,而.bat
文件则作为Windows批处理脚本执行。python.exe
运行.py
文件,而是使用其他程序打开它们,比如文本编辑器notepad.exe
。python <scriptname>.py
(或编写一个.bat
文件来代替您执行此操作)。#!/usr/bin/python
或#!/usr/bin/env python
),会发生什么呢?嗯,由于在Python中#
是一行注释,Python解释器会忽略它。这就是为什么Unix/Linux世界中使用大多数脚本语言都以#
开头作为注释行的原因之一。#!
行有点误导人;Windows根本看不到#!
行,实际上依赖于文件扩展名来告诉它该做什么。这有几个缺点:
.py
结尾,以便自动识别。.py
文件类型的默认启动行为,Windows将不再自动使用Python运行这些脚本。请注意,这可能是无意中发生的。#!/usr/bin/pthon
而不是#!/usr/bin/python
,你会收到一个包含以下文本的错误信息:/usr/bin/pthon: bad interpreter: No such file or directory.
“解释器”这个词给了我们关于 shebang 行的角色的线索(尽管从技术上讲,指定的程序可以是除解释器之外的其他东西,例如 cat 或文本编辑器)。当您尝试执行一个文件时,会发生以下情况:
这有几个优点:
python <myscript>
.py2
和.py3
扩展名。因此,Linux(+x位)和Windows(文件扩展名)都需要文件系统中的元数据。主要区别在于+x位在传输过程中更容易丢失。这不一定是一个缺点。 - MSalters/usr/bin/i686/python
和/usr/bin/amd64/python
呢?这很合理,但它会破坏那些在/usr/bin/python
上有硬编码假设的Python脚本。解释器的选择不是脚本作者的选择,而是脚本用户的选择。脚本作者只能选择语言(方言)。 - MSalters/usr/bin/env
的作用,还有 env-setup 脚本。Windows 版本是什么呢?在启动 .py
文件之前运行 regedit
脚本以确保获得所需的解释器吗? - Kyle Strand#!/bin/bash [optional Bash arguments]
# Bash script code here
...
exit 0;
#!/usr/bin/python [optional Python arguments]
# Python code here
...
exit()
/usr/bin/python
(这可能是Python 2或Python 3,取决于您的个人系统配置)。
#!/bin/bash -x
,#!/usr/bin/perl -lan
等)。 - kos/usr/bin/env python
来获取正确的Python时,这可能会很麻烦。 - mike3996env
的问题是什么,但问题似乎不是参数的数量:#!/usr/bin/perl -l -a -n
有三个参数,但它可以工作。虽然我还是无法理解确切的问题。 - kos./
开头。换句话说,只需使用python filename.py
或bash script.sh
即可正常工作。只有在命令名称中包含./
时才需要,这样可以告诉shell不要在$PATH
中搜索(可能找不到当前目录中的文件),而是按照您指定的路径执行。但这不适用于命令参数。 - Marc van Leeuwenenv
如何从内核接收其余参数的方式上。它们可能都被假设为一个大的参数,没有进行按空格分割。抱歉表达不清楚,我对此的细节记忆不太深刻了。 - mike3996这一行:
#!/usr/bin/python
#!/usr/bin/python
表示文件的内容将由位于/usr/bin/python
的python
二进制文件进行解释。python script_name
#!/bin/bash
的情况下:bash script_name
shebang
中见过连字符。由于这个词是由"hash"和"bang"组成的,你的拼写并不清楚,因为它看起来像是**"she"**和"bang"的组合。 - Kyle Strand#
= “hash”)或者“shebang”(#
= “sharp”),取决于你如何称呼 #
字符。然而,“shebang”确实更常见。@KyleStrand - Byte Commander#!/usr/bin/env python
#!/usr/bin/env python3
#!
(shebang)行。这取决于如何处理Python代码,无论是在Python交互模式下运行代码还是在Python脚本中。
Python交互模式允许用户直接输入和运行Python代码,不需要shebang行。要运行交互模式,请打开终端并键入python
(Python 2.X)或python3
(Python 3.X)。$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
$ python3
Python 3.4.3 (default, Oct 14 2015, 20:33:09)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Python脚本允许用户将Python代码写入和保存到纯文本文件中,然后稍后运行代码。这可能需要或不需要shebang行。然而,在Linux中使用Python脚本时,有两个已知原因需要shebang行。
在可执行脚本中运行Python代码,即定义代码应如何运行以及使用什么解释器;
根据特定版本的Python运行Python代码,即仅运行与Python 2.X或Python 3.X兼容的代码
以下是我用来展示#!
(shebang)行是否需要的文件列表和内容。
$ ls -ln *.py
-rw-rw-r-- 1 1000 1000 94 Dec 14 18:37 hello1.py
-rwxrwxr-x 1 1000 1000 116 Dec 14 18:37 hello2e.py
-rw-rw-r-- 1 1000 1000 116 Dec 14 18:37 hello2.py
-rwxrwxr-x 1 1000 1000 117 Dec 14 18:37 hello3e.py
-rwxrwxr-x 1 1000 1000 120 Dec 14 18:37 hello3m.py
-rw-rw-r-- 1 1000 1000 117 Dec 14 18:37 hello3.py
$ file *.py
hello1.py: ASCII text
hello2e.py: Python script, ASCII text executable
hello2.py: Python script, ASCII text executable
hello3e.py: Python script, ASCII text executable
hello3m.py: Python script, UTF-8 Unicode (with BOM) text executable
hello3.py: Python script, ASCII text executable
hello1.py
只包含源代码。
import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))
print("Hello, World!")
hello2.py
包含源代码和 shebang 行。
#!/usr/bin/env python
import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))
print("Hello, World!")
hello2e.py
与 hello2.py
相同,并且可执行。
hello3.py
与 hello2.py
相同,只是将第一行改为 #!/usr/bin/env python3
以适应 Python 3。
hello3e.py
与 hello3.py
相同,并且可执行。
hello3m.py
与 hello3.py
相同,并且可执行,只是在文本编辑器(如 Mousepad)中保存时选择了 "Write Unicode BOM" 选项。
$ python hello1.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2]
Hello, World!
$ python3 hello1.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09)
[GCC 4.8.4]
Hello, World!
python
或python3
命令运行Python脚本时,不需要添加shebang行。
以下是在带有shebang行的情况下运行源代码时的命令和输出,这适用于Python 2和Python 3,包括非可执行和可执行的情况。
$ ./hello1.py
bash: ./hello1.py: Permission denied
$ ./hello2.py
bash: ./hello2.py: Permission denied
$ ./hello3.py
bash: ./hello3.py: Permission denied
$ ./hello2e.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2]
Hello, World!
$ ./hello3e.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09)
[GCC 4.8.4]
Hello, World!
hello3m.py
作为可执行脚本运行失败并返回了一个错误。$ ./hello3m.py
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory
这是一个已知限制,即Shebang不起作用或变得无效。当一个文件保存为Unicode BOM(字节顺序标记)时,它将无法像可执行的Python脚本一样正常运行。
这个附加例子仅应被视为支持证据。用户应避免运行此示例,尽管结果是无害的。
我创建了另一个文件称为hello1e.py
,它包含与hello1.py
相同的内容并且可以执行。运行此脚本会返回语法错误。
$ ./hello1e.py
./hello1e.py: line 2: syntax error near unexpected token `"Hello from Python %s\n"'
./hello1e.py: line 2: `sys.stdout.write("Hello from Python %s\n" % (sys.version,))'
sys
的文件。$ file sys
sys: PostScript document text conforming DSC level 3.0, Level 1
已经确定将sys
文件识别为没有文件扩展名的PostScript文件。该文件可以在文档查看器(如Evince)中打开,实际上文件中包含了我之前点击的窗口的截图。根据我的经验,该文件的大小可能达到几兆字节。
再次强调,必须添加shebang行,并且在将Python脚本作为可执行脚本运行时,脚本必须具有可执行权限。否则,脚本将会出现上述描述的问题。
术语“使其可执行”或“必须具有可执行权限”指的是运行脚本的权限。可以通过在终端中运行chmod +x 文件名
命令,或者在文件管理器的属性窗口中勾选“允许此文件作为程序运行”或类似选项来实现。
虽然其他现有答案已经涵盖了几乎所有内容,但本答案采用了不同的方法,通过使用实际示例来解释问题。代码语法已经经过精心编写,以便这些示例可以在Python 2或Python 3中运行。
Python代码已经从在Windows上使用Python和在Unix平台上使用Python进行了调整,还添加了一行代码,用于编写无处不在的“Hello, World!”程序。/usr/bin/python
来执行它,这就是如何将其与其他语言区分开来的方式,比如bash,您可以使用#!/bin/bash
。这样您就可以简单地运行:./[file-to-execute]
python ./[file-to-execute].py
#!
部分通常被称为shebang、crunch bang或hashbang。/usr/bin/env
将确保使用的解释器是环境中 $PATH
的第一个。另一种方法是硬编码类似于 #!/usr/bin/python
这样的内容;#!
,后面跟着解释器和可能需要的任何标志。对于像Linux这样仍然使用Python 2.x作为标准的操作系统非常有帮助,但大多数人也会下载3.x。
默认情况下运行2.x。因此,我的3.x代码,我会添加前缀
#!/usr/bin/env python3
.
后面的部分)来确定文件的类型。即使Windows也在逐渐改变这一点:检查Microsoft Word文件的前几行,它会说明它实际上是一个Microsoft Word文件。 - Charles Greenpython myscript.py
。 - Chris Hpython <script>
来运行Python脚本。在我以前在Windows上开发Python时,我习惯将.py
文件的默认运行程序设置为gvim
。 - Kyle Strand#!
,23
21
)开头,后面跟着解释器的路径,如果解释器与调用脚本的解释器不同的话。 - Elliott Frischpython <script>
,通常在Linux上运行我在Windows下编写的脚本时也是如此。这可能与我写python脚本的原因有关:对于计算机管理任务,我使用bash(Linux)或.bat + bash(带cygwin的Windows)的奇异混合,而我的Python脚本则主要用于处理数据。 - Chris H-- coding: utf-8 -- 对我来说也是个好办法
- Rafs