如何在#中识别Python版本!使用环境变量

时间:2011-08-03 20:32:59

标签: python linux interpreter

我遇到的问题是由我们的封装设计引起的。到目前为止,我们的许多脚本都是用bash编写的,因此#!/bin/bash总是很简单。

但是现在我们在python中重写我们的脚本有点困难了。我们提供了特定版本的python(以避免客户端安装环境中的版本差异,从而破坏我们的实现)。因为python的特定版本位于已安装的目录结构中,所以我需要路由到它。

但是我不认为#!语句可以接受来自执行文件的shell的环境变量(尝试并得到一个糟糕的解释器)。

例如:

foo.py {p>我有#!$dirloc/wherepythonlives/python

在bash shell中,我执行了文件并得到了错误的解释器。 有没有办法将环境变量隐藏到#!行?

或者我必须依赖明确的路径?我们希望在一个环境中支持我们软件的多个版本(可能意味着多个python版本),所以我希望以某种方式将Python的!#语句保存在我们安装的目录级别中。

4 个答案:

答案 0 :(得分:5)

执行此操作的常用方法是使用env程序:

#!/usr/bin/env python

这将导致envPATH环境中查找名为python的二进制文件。

答案 1 :(得分:1)

我不知道能够在shebang中使用环境变量。您可以使用相对路径

#! ../../usr/bin/python

编辑: 您始终可以使用env指定使用特定版本。然后,如果可以在$ PATH中找到该版本,则将使用该脚本,否则脚本将失败

#! /usr/bin/env python2.7

或者您可以将入口点改为通用脚本。

例如

#! /usr/bin/env bash

if [[ $MYPYTHON ]]
then 
    $MYPYTHON main.py
else
    echo error message
fi

答案 2 :(得分:0)

这种困境的最佳解决方案是使用distutils(setup.py,为您自动创建正确的存根,用于许多给定的“控制台入口点”)和virtualenv(处理“隔离”多个装置“部分”。

答案 3 :(得分:0)

我想这一切都取决于脚本的调用方式和环境。您可以使用#!/usr/bin/env python来调用脚本,这样您就可以通过操纵环境PATH来控制使用哪个python。

你总是可以指定一个包装器脚本作为解释器,它运行一个相对于脚本位置的python可执行文件:

foo.py:

#!/bin/pyselector

import sys
sys.exit(0)

pyselector:

#!/bin/sh
SCRIPT_PATH="$(readlink -f $1)"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"

"${SCRIPT_DIR}/my/local/python" "$@"