我想我已经在脑海中回答了我自己的问题但是如果还有其他原因我不知道,我想知道运行python脚本与
python script.py
并使用shebang
#!/usr/local/bin/python
我通常将脚本作为自动执行脚本运行,因此我使用了shebang。我刚遇到一个使用
运行程序的团队成员python script.py
我的问题是哪种方式更好还是个人偏好?
如果我使用shebang运行,我可以指定我想要/需要使用的版本。唯一的问题是我需要确保在该位置安装了该版本。
如果我以另一种方式运行它(不知道该怎么称呼它,非shebang方式?),我需要确保我想要使用的版本在我的路径中或在我的路径中正确定义。我也可以键入python的完整路径,但如果路径很长,那就会变得很累。
我还有其他的好处/缺点吗?感谢。
答案 0 :(得分:2)
如果您想使用shebang运行脚本,则必须确保运行脚本的用户对相关脚本(chmod u+x script.py
)具有执行权限。如果你用脚本作为参数调用python,情况并非如此。
shebang解决方案的另一个问题是你正在强制python可执行文件的位置。如果我尝试运行你的脚本并且我的python版本在/usr/bin/python
而不是/usr/local/bin/python
,我将不得不编辑你的脚本。在其他平台上,例如Windows,我也必须编辑它。
答案 1 :(得分:1)
对于shebang,脚本必须位于允许执行的卷上,必须允许任何安全模块执行,并且必须存在shebang中指定的解释器。
直接调用解释器只需要脚本可读。
答案 2 :(得分:1)
在一般环境中它们是相同的。
然而,shebang为您提供了额外的好处,您可以非常轻松地替换您的可执行文件,而无需仅通过替换文件来更改任何其他文件。第二个(更好的)实现可能是任何东西。对于基于脚本的环境,我总是使用shebang,使用语言夹具。
对于shebang行,you need to be concerned about the location of python binary
无效的论点。你总能写:
#!/usr/bin/env python
让当地环境为您决定。
答案 3 :(得分:0)
如果您将python视为可以从符合POSIX标准的shell执行的脚本语言,那么它实际上并不重要。
也就是说,鉴于Python或多或少已经通过其软件包管理和安装变得标准化,我认为没有上述内容。应该做的是将所有脚本转换为模块中的callables(函数或可调用类实例)(最好定义为命名空间包)。可调用是您的程序/脚本的入口点。然后,setuptools
兼容setup.py
应该放在该模块项目的根目录中,并将其定义为程序的入口点。
一个例子:
在example.package/example/package/script.py
:
def main():
print('hello world')
setup.py
:
from setuptools import setup, find_packages
setup(
name='example.package',
description='An example package with an entry point',
...
entry_points="""
# -*- Entry points: -*-
[console_scripts]
script = example.package.script:main
""",
)
请注意,脚本定义为example.package.script:main
,其中:
之前的元素对应于包,第二个元素是可调用的。在这种情况下,它对应于main
中的example/package/script.py
函数(标准python模块布局)。
安装包(最好是在virtualenv中)将生成正确的"可执行文件"可以在所有操作系统上立即从shell中访问(即在Windows上,将创建基本上将使用脚本启动Python的script.exe
。)