目的#的!在/ usr / bin中/ python3

问题描述 投票:111回答:6

我有一对夫妇的脚本语言的注意到了这一点,但在这个例子中,我使用python。在很多教程,他们将与在第一行#!/usr/bin/python3启动。我不明白为什么我们有这个。

  • 如果不是操作系统知道这是一个Python脚本(显然它的安装,因为你正在对它的引用)
  • 如果用户使用的不是基于Unix的一个操作系统是什么
  • 语言是安装在无论出于何种原因不同的文件夹
  • 用户有不同的版本。特别是当它不是一个完整的版本号(像Python3 VS Python32)

如果有的话,我可以看到这打破了,因为上面所列出的原因python脚本。

python scripting
6个回答
207
投票

#!/usr/bin/python3是shebang行。

甲shebang行定义了解释器所在的位置。在这种情况下,python3解释位于/usr/bin/python3。甲shebang行也可以是bashrubyperl或任何其他脚本语言解释,例如:#!/bin/bash

如果没有家当线,操作系统不知道这是一个Python脚本,即使你设置执行标志上的脚本和喜欢./script.py运行它。为了使默认在python3运行脚本,或者调用它作为python3 script.py或设置家当线。

您可以使用#!/usr/bin/env python3便携性在不同系统中的情况下,他们已经安装在不同地点的语言解释器。


19
投票

这就是所谓的散列爆炸。如果从shell中运行脚本,它会检查第一线搞清楚什么程序应该开始解释脚本。

非基于Unix的操作系统将使用它自己的规则来确定如何运行脚本。 Windows为例子将使用的文件扩展名和#将导致第一行作为注释处理。

如果路径到Python的可执行文件是错误的,那么自然,脚本将失败。这是很容易创建从无论是通过标准约定指定位置的实际可执行文件。


10
投票

此行有助于找到将要运行脚本程序的可执行文件。这家当符号是在大多数的脚本语言(至少在成年操作系统使用的)相当标准。

这条线的一个重要方面是指定哪个解释将被使用。在许多发展为核心的Linux发行版,例如,它是正常的安装,同时蟒蛇的几个版本。

的Python 2.x和Python 3的不是100%兼容,因此这种差异是非常重要的。所以#! /usr/bin/python#! /usr/bin/python3是不一样的(也不是很为这个页面上的其他地方提到的一样#! /usr/bin/env python3


5
投票
  1. 而这条线是如何。
  2. 它被忽略。
  3. 它将无法运行,而应改为指向正确的位置。或env应该被使用。
  4. 它将无法运行,并可能无法在不同的版本上运行而不管。

2
投票

为了澄清家当线如何工作的窗口,从3.7 Python doc

  • 如果一个脚本文件的第一行以#!它被称为“认领”行。 Linux和其他Unix类操作系统有这样的线路原生支持,他们是在这样的系统中通常用来表示一个脚本应该如何执行。
  • Python的启动为Windows允许相同的设施与Windows上的Python脚本中使用
  • 要允许在Python脚本家当线是Unix和Windows之间移植,启动支持许多“虚拟”命令来指定要使用的解释。所支持的虚拟命令是: 在/ usr /斌/包膜蟒蛇 家当线在/ usr / bin中/ env的形式有一个进一步的特殊属性。查找已安装的Python解释之前,这种形式将搜索Python可执行程序的可执行文件的路径。这对应于Unix的ENV程序,其执行路径搜索的行为。 在/ usr / bin中/蟒蛇 在/ usr / local / bin目录/蟒蛇 蟒蛇

1
投票

其实什么类型的文件确定一个文件是很复杂的,所以现在的操作系统不能只知道。它可以使很多基于猜测的 -

  • 延期
  • DWS
  • 哑剧

但命令行不与所有的麻烦,因为它运行有限的向后兼容层,从那个时候看中废话不意味着什么。如果您双击它肯定的是,现代操作系统可以身影,OUT-但如果你在终端上运行它,然后没有,因为终端不关心你的想象OS特定文件输入的API。

至于其他问题。这是一个方便的,这是同样可以运行

python3 path/to/your/script

如果你的Python是不是在指定的路径,那么它不会工作,但我们往往安装的东西做出这样的东西的工作,而不是周围的其他方式。实际上它并不重要,如果你是下* nix中,它给你的shell是否考虑这条线,因为它是一个shellcode。因此,例如,你可以在Windows下运行bash

实际上,你可以ommit这一行完全,它只是意味着调用者必须指定一名翻译。另外,不要把你的翻译在非标准的位置上,然后尝试调用脚本,而无需提供一个解释。

© www.soinside.com 2019 - 2024. All rights reserved.