如何通过环境变量识别Python版本#!

1 投票
4 回答
1548 浏览
提问于 2025-04-16 22:50

我遇到了一个问题,这个问题是因为我们的设计方式造成的。到目前为止,我们写了很多脚本都是用bash,所以开头的#!/bin/bash都很简单。

但是现在我们要把脚本重写成python,这就有点麻烦了。我们会提供一个特定版本的python(这样可以避免客户的环境中不同版本导致我们的实现出问题)。因为这个特定版本的python是在一个安装好的目录结构里,所以我需要指向它。

不过我觉得#!这个声明不能接受执行文件的shell中的环境变量(我试过了,结果是坏的解释器)。

比如:

foo.py里,我写了#!$dirloc/wherepythonlives/python

然后我在bash shell中执行这个文件,结果出现了坏的解释器错误。

有没有办法把环境变量偷偷放进这个#!行里呢?

还是说我必须依赖一个明确的路径?我们想在一个环境中支持多个版本的软件(这可能意味着多个python版本),所以我希望能把Python的#!声明放在我们安装的目录层级里。

4 个回答

0

解决这个问题的最佳方法是使用distutils(setup.py,它会自动为你创建正确的存根,适用于多个给定的“控制台入口点”)和virtualenv(处理“隔离的多个安装”部分)。

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
6

一种常见的方法是使用 env 程序:

#!/usr/bin/env python

这会让 envPATH 环境变量中查找一个叫 python 的可执行文件。

撰写回答