我应该把#! (shebang)在Python脚本中,它应该采取什么forms?

我应该把我的Python脚本中的shebang? 以什么forms?

#!/usr/bin/env python 

要么

 #!/usr/local/bin/python 

这些是否同样便携? 哪种forms最常用?

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

任何脚本中的shebang行决定了脚本能够像独立的可执行文件一样被执行,而无需事先在terminal中inputpython ,或者在文件pipe理器中双击(如果configuration正确)。 这是没有必要的,但通常会放在那里,所以当有人看到在编辑器中打开的文件,他们立即知道他们在看什么。 但是,你使用哪条线重要的; 正确的用法是:

 #!/usr/bin/env python 

通常默认为python 2.7.latest,以下默认为3.latest

 #!/usr/bin/env python3 

不使用:

 #!/usr/local/bin/python 

“在这些情况下,python可能安装在/ usr / bin / python或/ bin / python中,上面的#!将会失败。”

– “#!/ usr / bin / env python”vs“#!/ usr / local / bin / python”

这只是一个品味问题。 添加shebang意味着用户可以直接调用脚本(假设它被标记为可执行文件)。 省略它只是意味着必须手动调用python

运行程序的最终结果不会受到任何影响; 这只是手段的select。

我应该把我的Python脚本中的shebang?

把一个shebang放到一个Python脚本中来表明:

  • 这个模块可以作为脚本运行
  • 是否只能在python2,python3上运行,还是Python 2/3兼容
  • 在POSIX上,如果你想直接运行脚本而不显式地调用python可执行文件,这是必要的

这些是否同样便携? 哪种forms最常用?

如果你手动编写一个shebang 那么总是使用#!/usr/bin/env python除非你有特定的理由不使用它。 即使在Windows(Python启动器)上也可以理解这种forms。

注意: 安装的脚本应该使用特定的python可执行文件,例如/usr/bin/python/home/me/.virtualenvs/project/bin/python 。 如果在shell中激活一个virtualenv,那么某些工具会中断。 幸运的是,在大多数情况下,通过setuptools或分发包工具(在Windows上, setuptools可以自动生成包装.exe脚本)自动创build正确的shebang。

换句话说,如果脚本在源代码签出,那么你可能会看到#!/usr/bin/env python 。 如果安装了,那么shebang是一个特定的python可执行文件的path,例如#!/usr/local/bin/python (注意:不应该手动从后面的类别中写入path)。

要select是否应该在shebang中使用pythonpython2python3 ,请参阅PEP 394 – 类Unix系统上的“python”命令 :

  • python应该只用于Python 2和3的源代码兼容的脚本。

  • 为了准备最终更改Python的默认版本,仅将Python 2的脚本更新为与Python 3的源代码兼容,否则将在shebang代码行中使用python2

如果您有多个版本的Python,并且脚本需要在特定版本下运行,那么she-bang可以确保在脚本直接执行时使用正确的脚本,例如:

 #!/usr/bin/python2.7 

请注意,脚本仍然可以通过一个完整的Python命令行或通过导入运行,在这种情况下,she-bang被忽略。 但是对于直接运行的脚本,这是使用she-bang的一个体面的理由。

#!/usr/bin/env python通常是更好的方法,但这有助于特殊情况。

通常build立一个Python虚拟环境会更好,在这种情况下,通用的#!/usr/bin/env python会为virtualenv标识Python的正确实例。

如果脚本是可执行的,你应该添加一个shebang。 您还应该使用安装软件来安装该脚本,该软件将shebang修改为正确的,以便在目标平台上运行。 这个例子是distutils和Distribute。

shebang的目的是让脚本在你想从shell执行脚本时识别解释器types。 大多数情况下,并不总是通过向外部提供解释器来执行脚本。 用法示例: python-xx script.py

即使你没有shebang声明符,这也可以工作。

为什么第一个更“便携”,是因为/usr/bin/env包含PATH声明,它占系统可执行文件所在的所有目的地。

注:龙卷风不严格使用shebangs,而Django严格不使用shebangs。 这取决于您如何执行应用程序的主要function。

另外:它不会因Python而异。

有时候,如果答案不是很清楚(我的意思是说你不能确定是或否),那么没有太大的关系,你可以忽略这个问题,直到答案清楚的。

#! 只有目的是为了启动脚本。 Django自己加载源代码并使用它们。 它永远不需要决定应该使用什么解释器。 这样, #! 其实在这里没有意义。

一般来说,如果它是一个模块,不能用作脚本,则不需要使用#! 。 另一方面,一个模块源通常包含if __name__ == '__main__': ...至less有一些简单的functiontesting。 然后#! 再次合理。

使用#!一个很好的理由#! 是当你同时使用Python 2和Python 3脚本 – 它们必须由不同版本的Python解释。 这样,你必须记住手动启动脚本时必须使用的python (没有#!里面)。 如果你有这样的脚本混合使用#!是一个好主意 里面,使他们可执行,并启动他们作为可执行文件(chmod …)。

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

先使用

 which python 

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

这个输出可以是任何如

 /usr/bin/python 

要么

 /bin/python 

现在适当selectshebang线并使用它。

答:只有当你打算把它做成一个命令行可执行脚本。

这里是程序:

从validation正确的shebangstring开始使用:

 which python 

从中得到的输出,并在第一行添加(与shebang#!)。

在我的系统上,它的响应如下所示:

 #which python /usr/bin/python 

所以你的shebang看起来像:

 #!/usr/bin/python 

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

 python filename.py 

要使其成为命令,请复制它以删除.py扩展名。

 cp filename.py filename 

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

 chmod +x filename 

要testing它,使用:

 ./filename 

最好的做法是把它移动到你的$ PATH的某个地方,所以你需要input的只是文件名。

 sudo cp filename /usr/sbin 

这样它会在任何地方工作(没有./之前的文件名)

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

要解决这个问题,我必须编辑Windowsregistry项HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command 。 这仍然有价值

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

从我以前的Python 2.7安装。 我修改了这个registry键值

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

和Python启动器shebang线处理如上所述工作。