关于可执行文件:Python部署和/ usr / bin / env可移植性

关于可执行文件:Python部署和/ usr / bin / env可移植性

Python deployment and /usr/bin/env portability

在所有可执行Python脚本的开头,我都添加了shebang行:

1
#!/usr/bin/env python

我正在env python产生Python 2.2环境的系统上运行这些脚本。我的脚本很快失败了,因为我需要手动检查兼容的Python版本:

1
2
if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

如果可能的话,我不想更改每个可执行文件的shebang行;但是,我没有对该计算机的管理访问权限来更改env python的结果,并且我不想强制使用特定版本,例如:

1
#!/usr/bin/env python2.4

我想避免这种情况,因为系统可能具有比Python 2.4更高的版本,或者可能具有Python 2.5但没有Python 2.4。

什么是优雅的解决方案?

[编辑:]我在提出问题时还不够具体-我想让用户无需手动配置即可执行脚本(例如,路径更改或~/bin中的符号链接,并确保您的PATH具有~/bin在Python 2.2路径之前)。也许需要一些分发实用程序来防止手动调整?


" env "简单地执行它在PATH env var中找到的第一件事。要切换到其他python,请在调用脚本之前将该Python \\可执行文件的目录放在路径之前。


一个非常骇人听闻的解决方案-如果检查失败,请使用此功能(可能会大大改进)来确定可用的最佳解释器,确定它是否可以接受,如果可以,请使用os.system或类似的方法重新启动您的脚本您的sys.argv使用新的解释器。

1
2
3
4
5
6
7
8
9
10
11
import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i,"python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]

如果正在运行脚本,则可以将PATH变量设置为首先指向私有bin目录:

1
2
3
$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

然后,当您执行python脚本时,它将使用python 2.4。您必须更改登录脚本才能更改PATH。

或者使用所需的显式解释器运行python脚本:

1
$ /path/to/python2.4 <your script>

如果您(1)绝对要使用shebangs并且(2)能够在构建过程中使用Autotools,那么这里是一个解决方案。

我昨晚才发现,您可以使用autoconf宏AM_PATH_PYTHON查找最小的Python 2二进制文件。操作方法在这里。

因此,您的过程将是:

  • configure.ac中发出AM_PATH_PYTHON(2.4)
  • 将所有.py脚本重命名为.py.in(以我的经验,这不会混淆vi)
  • AC_CONFIG_FILES命名所有要生成的Python脚本。
  • 代替以#!/usr/bin/env python开头,使用#!@PYTHON@

然后您生成的Python脚本将始终具有适当的shebang。

因此,如果不切实际,至少有此解决方案。


@morais:这是一个有趣的想法,但我认为也许我们可以再走一步。也许有一种方法可以使用Ian Bicking的virtualenv进行以下操作:

  • 首先查看我们是否在可接受的环境中运行,如果是,则不执行任何操作。
  • 检查PATH上是否存在特定于版本的可执行文件,即检查python2.x是否存在for x in reverse(range(4, 10))。如果是这样,请使用更好的解释器重新运行该命令。
  • 如果没有更好的解释器,请使用virtualenv尝试从较旧的Python版本安装Python的较新版本,并获取所有必备软件包。

我不知道virtualenv是否能够做到这一点,所以我很快就会解决它。 :)


推荐阅读

    linux把命令变成脚本?

    linux把命令变成脚本?,系统,环境,工作,脚本,命令,信息,基础,代码,文件,变量,

    linux脚本命令输信息?

    linux脚本命令输信息?,系统,信息,代码,脚本,数据,工具,发行,命令,变量,文件,l

    linux上启动脚本命令?

    linux上启动脚本命令?,服务,状态,系统,代码,脚本,工作,周期性,命令,文件,方

    linux部署环境的命令?

    linux部署环境的命令?,环境,基础,项目,管理,软件,状态,设备,平台,网络,传播,

    linux下编写脚本命令?

    linux下编写脚本命令?,代码,时间,工具,标准,系统,实战,平台,最新,网站,文件,l

    linux定时器脚本命令?

    linux定时器脚本命令?,系统,代码,时间,工具,工作,定期,周期性,异常,任务,脚

    linux命令项目部署?

    linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎

    linux停止脚本命令行?

    linux停止脚本命令行?,系统,工作,平台,命令,基础,第一,环境,信息,终端,程序,

    linux命令运行脚本?

    linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运

    linux部署项目的命令?

    linux部署项目的命令?,项目,系统,设备,环境,工作,基础,传播,信息,标准,代码,L

    linux脚本赋权限命令?

    linux脚本赋权限命令?,系统,档案,工作,命令,工具,脚本,权限,文件,程序,文件

    linux常用部署命令?

    linux常用部署命令?,工作,地址,系统,信息,命令,目录,标准,基础,管理,工具,Lin

    linux关闭脚本命令?

    linux关闭脚本命令?,系统,服务,状态,命令,档案,暂停,软件,工具,数据,电脑,lin

    linux激活脚本命令?

    linux激活脚本命令?,系统,信息,环境,脚本,命令,代码,服务,工具,标准,官网,如

    linux循环命令脚本?

    linux循环命令脚本?,代码,系统,增长,工具,官网,项目,流程,数据,数字,底部,lin

    执行脚本命令linux?

    执行脚本命令linux?,工作,脚本,服务,命令,文件,方法,权限,目录,用户,可能会,L

    linux运行可执行命令?

    linux运行可执行命令?,系统,软件,工具,状态,暂停,代码,服务,命令,官方网站,

    停止linux脚本命令行?

    停止linux脚本命令行?,状态,电脑,命令,传播,检测,终端,模式,指令,文件,进程,l

    linux执行命令脚本?

    linux执行命令脚本?,代码,工作,底部,系统,状态,命令,脚本,暂停,情况,文件,lin

    linux重启脚本命令?

    linux重启脚本命令?,系统,代码,脚本,软件,周期性,百分比,时间,检测,服务,状