2

我正在从 python 模块返回字符串,以便在 bash 脚本中使用。

这是我到目前为止所拥有的:

SCRIPT_DIR=/somepath/to/scripts/folder
cd $SCRIPT_DIR/eod

python_cmd='import sys;
            sys.path.append("/somepath/to/scripts/folder/utils"); 
            import settings as st; 
            print " ".join(st.foo())'

# Fix indentation for Python
python_cmd=${python_cmd//'            '/''}

my_array=(`python -c "$python_cmd"`)

我想在上面的代码片段中使用 DRY 哲学。但是,该字符串/somepath/to/scripts/folder在脚本中重复出现。我想将 $SCRIPT_DIR 的定义传递给 python_cmd - 但是我尝试了(用 $SCRIPT_DIR/utils 替换 python_cmd 中的路径字符串,但失败并出现以下错误:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
ImportError: No module named settings

我究竟做错了什么?

笔记:

我正在运行 bash 4.1.5

4

2 回答 2

3

根本不用费心传递字符串。不要sys.path在 Python 文本中进行修改,而是在 bash 脚本中修改 PYTHONPATH 环境变量。它更容易,并且无论如何都是影响导入路径的首选方式。

如何设置路径的示例:

SCRIPT_DIR=/somepath/to/scripts/folder
cd $SCRIPT_DIR/eod

export PYTHONPATH=$SCRIPT_DIR
python_cmd='import settings as st; 
            print " ".join(st.foo())'

我还不得不说,这似乎是一种将组件粘合在一起的奇怪方法,但我没有足够的信息来推荐更好的方法。

于 2012-07-09T13:15:52.740 回答
2

因为python命令是用单引号括起来的,$SCRIPT_DIR没有展开。尝试这个:

python_cmd='import sys;
            sys.path.append("'$SCRIPT_DIR'");
            import settings as st; 
            print " ".join(st.foo())'

也就是说,我会选择修改PYTHONPATH.

于 2012-07-09T13:18:32.880 回答