我应该把shebang放在我的Python脚本中吗?以什么形式?

#!/usr/bin/env python 

or

#!/usr/local/bin/python

它们同样便携吗?哪种形式使用最多?

注意:龙卷风项目使用shebang。另一方面,Django项目没有。


当前回答

当我最近在Windows 7上安装Python 3.6.1时,它还安装了Windows的Python启动器,它应该处理shebang行。然而,我发现Python启动器没有这样做:shebang行被忽略,并且总是使用Python 2.7.13(除非我使用py -3执行脚本)。

为了解决这个问题,我必须编辑Windows注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\命令。这仍然有价值

"C:\Python27\python.exe" "%1" %*

从我之前的Python 2.7安装。我将这个注册表项值修改为

"C:\Windows\py.exe" "%1" %*

Python Launcher shebang行处理工作如上所述。

其他回答

使用第一个

which python

这将给出输出作为python解释器(二进制)存在的位置。

这个输出可以是任意的

/usr/bin/python

or

/bin/python

现在适当地选择shebang线并使用它。

我们可以用:

#!/usr/bin/env

or

#!/bin/env

当我最近在Windows 7上安装Python 3.6.1时,它还安装了Windows的Python启动器,它应该处理shebang行。然而,我发现Python启动器没有这样做:shebang行被忽略,并且总是使用Python 2.7.13(除非我使用py -3执行脚本)。

为了解决这个问题,我必须编辑Windows注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\命令。这仍然有价值

"C:\Python27\python.exe" "%1" %*

从我之前的Python 2.7安装。我将这个注册表项值修改为

"C:\Windows\py.exe" "%1" %*

Python Launcher shebang行处理工作如上所述。

有时,如果答案不是很清楚(我的意思是你无法决定是或否),那么这并不太重要,你可以忽略这个问题,直到答案清楚为止。

# !唯一的目的是启动脚本。Django自己加载源代码并使用它们。它从不需要决定应该使用哪个解释器。这样,#!实际上在这里没有意义。

通常,如果它是一个模块,不能用作脚本,则不需要使用#!另一方面,模块源代码通常包含if __name__ == '__main__':…至少有一些琐碎的功能测试。然后#!这又说得通了。

使用#!当你同时使用Python 2和Python 3脚本时——它们必须由不同版本的Python解释。这样,你必须记住手动启动脚本时必须使用的python(没有#!内)。如果您混合使用了这些脚本,那么使用#!在内部,使它们可执行,并作为可执行文件启动它们(chmod…)。

使用MS-Windows时,#!这毫无意义——直到最近。Python 3.3引入了一个Windows Python启动器(py.exe和pyw.exe),它会读取#!行,检测已安装的Python版本,并使用正确的或明确需要的Python版本。由于扩展名可以与程序相关联,您可以在Windows中获得与基于unix的系统中的execute标志类似的行为。

任何脚本中的shebang行决定了脚本是否能够像独立可执行文件一样执行,而无需事先在终端中键入python或在文件管理器中双击它(在配置正确的情况下)。它不是必需的,但通常放在那里,这样当有人看到在编辑器中打开的文件时,他们立即知道他们在看什么。但是,你用哪条线是很重要的。

Python 3脚本(默认为版本3.latest)的正确用法是:

#!/usr/bin/env python3

Python 2脚本(默认为版本2.latest)的正确用法是:

#!/usr/bin/env python2

不应该使用以下代码(除非你编写的代码与Python 2兼容,这种情况很少见)。X和3.x):

#!/usr/bin/env python

PEP 394中给出这些建议的原因是,python可以在不同的系统上引用python2或python3。

此外,不要使用:

#!/usr/local/bin/python

python可以安装在/usr/bin/python或/bin/python 案例,以上#!将会失败。”

——“# !/usr/bin/env python“vs”!/ usr / local / bin / python)”

答:只有当您计划使它成为一个命令行可执行脚本时。

步骤如下:

首先验证要使用的正确的shebang字符串:

which python

从中获取输出并将其添加到第一行中(使用shebang #!)。

在我的系统上,它的反应如下:

$which python
/usr/bin/python

所以你的shebang看起来像这样:

#!/usr/bin/python

保存后,它仍然会像以前一样运行,因为python会将第一行视为注释。

python filename.py

为了使它成为一个命令,复制它以删除.py扩展名。

cp filename.py filename

告诉文件系统这将是可执行的:

chmod +x filename

要测试它,使用:

./filename

最好的做法是将它移动到你的$PATH中的某个地方,这样你只需要输入文件名本身。

sudo cp filename /usr/sbin

这样它就可以在任何地方工作(在文件名之前没有。/)