我遇到的问题是由我们的封装设计引起的。到目前为止,我们的许多脚本都是用bash编写的,因此#!/bin/bash
总是很简单。
但是现在我们在python中重写我们的脚本有点困难了。我们提供了特定版本的python(以避免客户端安装环境中的版本差异,从而破坏我们的实现)。因为python的特定版本位于已安装的目录结构中,所以我需要路由到它。
但是我不认为#!语句可以接受来自执行文件的shell的环境变量(尝试并得到一个糟糕的解释器)。
例如:
在foo.py
{p>我有#!$dirloc/wherepythonlives/python
在bash shell中,我执行了文件并得到了错误的解释器。
有没有办法将环境变量隐藏到#!
行?
或者我必须依赖明确的路径?我们希望在一个环境中支持我们软件的多个版本(可能意味着多个python版本),所以我希望以某种方式将Python的!#
语句保存在我们安装的目录级别中。
答案 0 :(得分:5)
执行此操作的常用方法是使用env
程序:
#!/usr/bin/env python
这将导致env
在PATH
环境中查找名为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" "$@"