我应该把shebang放在我的Python脚本中吗?以什么形式?
#!/usr/bin/env python
要么
#!/usr/local/bin/python
这些同样便携吗?哪种形式最常用?
Note: tornado项目使用了shebang . 另一方面,Django项目没有 .
先使用
which python
这将输出作为我的python解释器(二进制)所在的位置 .
此输出可以是任何此类输出
/usr/bin/python
/bin/python
现在适当选择shebang线并使用它 .
概括我们可以使用:
#!/usr/bin/env
#!/bin/env
如果你有多个版本的Python并且脚本需要在特定版本下运行,那么she-bang可以确保在直接执行脚本时使用正确的脚本,例如:
#!/usr/bin/python2.7
请注意,脚本仍然可以通过完整的Python命令行运行,或者通过导入运行,在这种情况下,将忽略she-bang . 但是对于直接运行的脚本,这是使用she-bang的正当理由 .
#!/usr/bin/env python 通常是更好的方法,但这有助于特殊情况 .
通常最好 Build 一个Python虚拟环境,在这种情况下,泛型 #!/usr/bin/env python 将为virtualenv识别正确的Python实例 .
有时候,如果答案不是很明确(我的意思是你不能决定是或否),那么它并不重要,你可以忽略问题直到答案清楚 .
#! 唯一目的是启动脚本 . Django自己加载源并使用它们 . 它永远不需要决定应该使用什么样的解释器 . 这样, #! 在这里实际上没有任何意义 .
#!
通常,如果它是一个模块而不能用作脚本,则不需要使用 #! . 另一方面,模块源通常包含 if __name__ == '__main__': ... ,至少对功能进行了一些简单的测试 . 然后 #! 再次有意义 .
if __name__ == '__main__': ...
使用 #! 的一个很好的理由是当你同时使用Python 2和Python 3脚本时 - 它们必须由不同版本的Python解释 . 这样,您必须记住在手动启动脚本时必须使用 python (内部没有 #! ) . 如果你有这样的脚本混合,最好使用 #! 里面,使它们可执行,并将它们作为可执行文件启动(chmod ...) .
python
使用MS-Windows时, #! 没有任何意义 - 直到最近 . Python 3.3引入了一个Windows Python Launcher(py.exe和pyw.exe),它读取 #! 行,检测已安装的Python版本,并使用正确或明确需要的Python版本 . 由于扩展可以与程序相关联,因此在Windows中可以获得与基于Unix的系统中的执行标志类似的行为 .
如果脚本是可执行的,您应该添加一个shebang . 您还应该使用安装软件安装脚本,该软件将shebang修改为正确的内容,以便它可以在目标平台上运行 . 这方面的例子是distutils和Distribute .
任何脚本中的shebang行都可以确定脚本执行的能力,就像独立的可执行文件一样,无需事先在终端中键入 python ,或者在文件管理器中双击它(正确配置) . 它还没有看到 . 但是,哪个shebang线你使用 IS 很重要 .
Python 3脚本的 Correct 用法是:
#!/usr/bin/env python3
默认为版本3.latest . 对于Python 2.7.latest使用 python2 代替 python3 .
python2
python3
以下 should NOT be used (除了极少数情况下,您编写的代码与Python 2.x和3.x兼容):
在PEP 394中给出这些建议的原因是 python 可以在不同系统上引用 python2 或 python3 . 它目前在大多数发行版中引用 python2 ,但这可能会在某些时候发生变化 .
Also, DO NOT Use:
“在这些情况下,python可以安装在/ usr / bin / python或/ bin / python中,上面的#!将会失败 . ”
我应该把shebang放在我的Python脚本中吗?
将shebang放入Python脚本中以指示:
此模块可以作为脚本运行
它是否只能在python2,python3上运行,还是与Python 2/3兼容在POSIX上
,如果要直接运行脚本而不显式调用 python 可执行文件,则必须这样做
这些是否同样便携?哪种形式最常用?
如果您手动编写一个shebang,那么除非您有特殊原因不使用它,否则请始终使用 #!/usr/bin/env python . 甚至在Windows(Python启动器)上也可以理解这种形式 .
注意:安装的脚本应使用特定的python可执行文件,例如 /usr/bin/python 或 /home/me/.virtualenvs/project/bin/python . 如果你在shell中激活virtualenv,一些工具会中断,这很糟糕 . 幸运的是,在大多数情况下, setuptools 或您的分发包工具会自动创建正确的shebang(在Windows上, setuptools 可以生成自动包装 .exe 脚本) .
/home/me/.virtualenvs/project/bin/python
setuptools
.exe
换句话说,如果脚本在源检出中,那么您可能会看到 #!/usr/bin/env python . 如果已安装,则shebang是特定python可执行文件的路径,例如 #!/usr/local/bin/python (注意:您不应手动编写后一类别的路径) .
要选择是否应在shebang中使用 python , python2 或 python3 ,请参阅PEP 394 - The "python" Command on Unix-Like Systems:
... python应该在shebang行中仅用于与Python 2和3兼容的脚本 . 为准备最终更改Python的默认版本,Python 2只应将脚本更新为源代码兼容Python 3或者在shebang行使用python2 .
shebang的目的是让脚本在你想从shell执行脚本时识别解释器类型 . 大多数情况下,并非总是如此,您通过外部提供解释程序来执行脚本 . 用法示例: python-x.x script.py
python-x.x script.py
即使您没有shebang声明者,这也会有效 .
为什么第一个更多"portable"是因为, /usr/bin/env 包含您的 PATH 声明,该声明说明系统可执行文件所在的所有目标 .
/usr/bin/env
PATH
注意:龙卷风不严格使用shebangs,Django严格不使用 . 它随执行应用程序主要功能的方式而变化 .
另外:它与Python不同 .
它's really just a matter of taste. Adding the shebang means people can invoke the script directly if they want (assuming it'标记为可执行文件);省略它只是意味着必须手动调用 python .
运行程序的最终结果不受任何影响;它只是手段的选择 .
当我最近在Windows 7上安装Python 3.6.1时,它还安装了用于Windows的Python Launcher,它应该处理shebang系列 . 但是,我发现Python Launcher没有这样做:shebang行被忽略,并且总是使用Python 2.7.13(除非我使用py -3执行脚本) .
要解决此问题,我必须编辑Windows注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command . 这仍然有 Value
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
"C:\Python27\python.exe" "%1" %*
从我早期的Python 2.7安装 . 我将此注册表项值修改为
"C:\Windows\py.exe" "%1" %*
并且Python Launcher shebang线处理如上所述工作 .
首先验证要使用的正确shebang字符串:
从中获取输出并在第一行添加它(使用shebang#!) .
在我的系统上它响应如下:
$which python /usr/bin/python
So your shebang will look like:
#!/usr/bin/python
保存后,它仍将像以前一样运行,因为python会将第一行视为注释 .
python filename.py
要使其成为命令,请将其复制以删除.py扩展名 .
cp filename.py filename
告诉文件系统这将是可执行的:
chmod +x filename
要测试它,请使用:
./filename
最佳做法是将它移动到$ PATH中的某个位置,这样您需要输入的只是文件名本身 .
sudo cp filename /usr/sbin
这样它可以在任何地方工作(没有文件名之前的./)
10 回答
先使用
这将输出作为我的python解释器(二进制)所在的位置 .
此输出可以是任何此类输出
要么
现在适当选择shebang线并使用它 .
概括我们可以使用:
要么
如果你有多个版本的Python并且脚本需要在特定版本下运行,那么she-bang可以确保在直接执行脚本时使用正确的脚本,例如:
请注意,脚本仍然可以通过完整的Python命令行运行,或者通过导入运行,在这种情况下,将忽略she-bang . 但是对于直接运行的脚本,这是使用she-bang的正当理由 .
#!/usr/bin/env python
通常是更好的方法,但这有助于特殊情况 .通常最好 Build 一个Python虚拟环境,在这种情况下,泛型
#!/usr/bin/env python
将为virtualenv识别正确的Python实例 .有时候,如果答案不是很明确(我的意思是你不能决定是或否),那么它并不重要,你可以忽略问题直到答案清楚 .
#!
唯一目的是启动脚本 . Django自己加载源并使用它们 . 它永远不需要决定应该使用什么样的解释器 . 这样,#!
在这里实际上没有任何意义 .通常,如果它是一个模块而不能用作脚本,则不需要使用
#!
. 另一方面,模块源通常包含if __name__ == '__main__': ...
,至少对功能进行了一些简单的测试 . 然后#!
再次有意义 .使用
#!
的一个很好的理由是当你同时使用Python 2和Python 3脚本时 - 它们必须由不同版本的Python解释 . 这样,您必须记住在手动启动脚本时必须使用python
(内部没有#!
) . 如果你有这样的脚本混合,最好使用#!
里面,使它们可执行,并将它们作为可执行文件启动(chmod ...) .使用MS-Windows时,
#!
没有任何意义 - 直到最近 . Python 3.3引入了一个Windows Python Launcher(py.exe和pyw.exe),它读取#!
行,检测已安装的Python版本,并使用正确或明确需要的Python版本 . 由于扩展可以与程序相关联,因此在Windows中可以获得与基于Unix的系统中的执行标志类似的行为 .如果脚本是可执行的,您应该添加一个shebang . 您还应该使用安装软件安装脚本,该软件将shebang修改为正确的内容,以便它可以在目标平台上运行 . 这方面的例子是distutils和Distribute .
任何脚本中的shebang行都可以确定脚本执行的能力,就像独立的可执行文件一样,无需事先在终端中键入
python
,或者在文件管理器中双击它(正确配置) . 它还没有看到 . 但是,哪个shebang线你使用 IS 很重要 .Python 3脚本的 Correct 用法是:
默认为版本3.latest . 对于Python 2.7.latest使用
python2
代替python3
.以下 should NOT be used (除了极少数情况下,您编写的代码与Python 2.x和3.x兼容):
在PEP 394中给出这些建议的原因是
python
可以在不同系统上引用python2
或python3
. 它目前在大多数发行版中引用python2
,但这可能会在某些时候发生变化 .Also, DO NOT Use:
将shebang放入Python脚本中以指示:
此模块可以作为脚本运行
它是否只能在python2,python3上运行,还是与Python 2/3兼容
在POSIX上
,如果要直接运行脚本而不显式调用
python
可执行文件,则必须这样做如果您手动编写一个shebang,那么除非您有特殊原因不使用它,否则请始终使用
#!/usr/bin/env python
. 甚至在Windows(Python启动器)上也可以理解这种形式 .注意:安装的脚本应使用特定的python可执行文件,例如
/usr/bin/python
或/home/me/.virtualenvs/project/bin/python
. 如果你在shell中激活virtualenv,一些工具会中断,这很糟糕 . 幸运的是,在大多数情况下,setuptools
或您的分发包工具会自动创建正确的shebang(在Windows上,setuptools
可以生成自动包装.exe
脚本) .换句话说,如果脚本在源检出中,那么您可能会看到
#!/usr/bin/env python
. 如果已安装,则shebang是特定python可执行文件的路径,例如#!/usr/local/bin/python
(注意:您不应手动编写后一类别的路径) .要选择是否应在shebang中使用
python
,python2
或python3
,请参阅PEP 394 - The "python" Command on Unix-Like Systems:shebang的目的是让脚本在你想从shell执行脚本时识别解释器类型 . 大多数情况下,并非总是如此,您通过外部提供解释程序来执行脚本 . 用法示例:
python-x.x script.py
即使您没有shebang声明者,这也会有效 .
为什么第一个更多"portable"是因为,
/usr/bin/env
包含您的PATH
声明,该声明说明系统可执行文件所在的所有目标 .注意:龙卷风不严格使用shebangs,Django严格不使用 . 它随执行应用程序主要功能的方式而变化 .
另外:它与Python不同 .
它's really just a matter of taste. Adding the shebang means people can invoke the script directly if they want (assuming it'标记为可执行文件);省略它只是意味着必须手动调用
python
.运行程序的最终结果不受任何影响;它只是手段的选择 .
当我最近在Windows 7上安装Python 3.6.1时,它还安装了用于Windows的Python Launcher,它应该处理shebang系列 . 但是,我发现Python Launcher没有这样做:shebang行被忽略,并且总是使用Python 2.7.13(除非我使用py -3执行脚本) .
要解决此问题,我必须编辑Windows注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
. 这仍然有 Value从我早期的Python 2.7安装 . 我将此注册表项值修改为
并且Python Launcher shebang线处理如上所述工作 .
答案:仅当您计划将其设为命令行可执行脚本时 .
这是程序:
首先验证要使用的正确shebang字符串:
从中获取输出并在第一行添加它(使用shebang#!) .
在我的系统上它响应如下:
So your shebang will look like:
保存后,它仍将像以前一样运行,因为python会将第一行视为注释 .
要使其成为命令,请将其复制以删除.py扩展名 .
告诉文件系统这将是可执行的:
要测试它,请使用:
最佳做法是将它移动到$ PATH中的某个位置,这样您需要输入的只是文件名本身 .
这样它可以在任何地方工作(没有文件名之前的./)