我应该把#! (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中使用python
, python2
或python3
,请参阅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线处理如上所述工作。