2015-06-12 36 views
1

我有以下脚本将干净PYTHONPATH设置与bash脚本PYTHONPATH和运行nosetests

#!/bin/bash 

# Get the directory the script is in 
DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) 

$ Walk up to root of branch dir 
DIR=$DIR/../../.. 

PYTHONPATH=$DIR/module1 
PYTHONPATH=$PYTHONPATH:$DIR/module2 
PYTHONPATH=$PYTHONPATH:$DIR/module3 
PYTHONPATH=$PYTHONPATH:$DIR/module4 
export PYTHONPATH 

这个脚本应该在串联中运行一个nosetest命令允许测试导入所有必要的需要的模块时没有任何问题:

./path/to/script/PythonPath.sh && nosetests <tons of other arguments>

然而,当我运行上面的命令,我在模块上指出它不存在的一个得到ImportError。我在脚本的末尾添加了一条echo语句来帮助调试,并且PYTHONPATH与其应该完全相同。我也尝试手动设置PYTHONPATH,似乎无法重现相同的问题。

+0

所以它的工作原理? – vicg

+0

@vicg是的,这是正确的。 – ILostMySpoon

+0

subshel​​l不能影响父shell,只需在脚本中运行测试即可。 – HuStmpHrrr

回答

5

你不能以这种方式在bash中设置环境变量。脚本最终在自己的过程中运行,在那里设置环境并且不会回到你的环境中。在这种情况下,你可以source.脚本有它影响你当前的环境:

source ./path/to/script/PythonPath.sh && nosetests <tons of other arguments> 

. ./path/to/script/PythonPath.sh && nosetests <tons of other arguments> 

而且,你有没有帮助额外的报价和至少1行的丢失评论角色。下面是这些补丁脚本:

#!/bin/bash 

# Get the directory the script is in 
DIR=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd) 

# Walk up to root of branch dir 
DIR=$DIR/../../.. 

PYTHONPATH=$DIR/module1 
PYTHONPATH=$PYTHONPATH:$DIR/module2 
PYTHONPATH=$PYTHONPATH:$DIR/module3 
PYTHONPATH=$PYTHONPATH:$DIR/module4 
export PYTHONPATH 

当我来源,文件获取:

当你手动设置
/tmp/scratch$ . PythonPath.sh 
/tmp/scratch$ echo $PYTHONPATH 
/tmp/scratch/../../../module1:/tmp/scratch/../../../module2:/tmp/scratch/../../../module3:/tmp/scratch/../../../module4 
+0

当我在脚本上运行'source'或'.'时,'PYTHONPATH'上的echo语句再现了我在脚本中引用的所有目录和Python文件的一长串,而不是通常的语法(例如'/ dir /模块1:/目录/ module2')。此外,问题仍然存在。 – ILostMySpoon

+0

在任何目录或模块名称中是否有空格?引用将是非常重要的,如果你做 –

+0

不,它们要么骆驼套或分开下划线。 – ILostMySpoon