我怎样才能在Python中使用这个bash测试构造?

时间:2013-03-11 07:09:07

标签: python bash subprocess

我有一个bash片段,我想移植到Python。它找到SVN所在的位置以及它是否可执行。

SVN=`which svn 2>&1` 
if [[ ! -x $SVN ]]; then
    echo "A subversion binary could not be found ($SVN)"        
fi

以下是我目前使用子进程模块在Python中的尝试:

SVN = Popen('which svn 2>&1', shell=True, stdout=PIPE).communicate()[0]
Popen("if [[ ! -x SVN ]]; then echo 'svn could not be found or executed'; fi", shell=True)

这不起作用,因为虽然我确实将SVN的位置保存在Python的本地命名空间中,但我无法从Popen访问它。

我也试过合并到一个Popen对象中:

Popen("if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi", shell=True)

但我得到了这个错误(不用说,看起来非常笨拙)

/bin/sh: -c: line 0: syntax error near `;'
/bin/sh: -c: line 0: `if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi'

是否有测试结构的Python版本“-x”?我认为那将是理想的。其他解决方法也将受到赞赏。

由于

3 个答案:

答案 0 :(得分:4)

这是最简单的解决方案:

path_to_svn = shutil.which('svn')
is_executable = os.access(path_to_svn, os.X_OK)

shutil.which是Python 3.3中的新功能;在this answer中有一个polyfill。如果你真的想要,也可以从Popen获取路径,但这不是必需的。

以下是os.access的文档。

答案 1 :(得分:1)

SVN = Popen('which svn 2>&1', shell=True, stdout=PIPE).communicate()[0]
str="if [[ ! -x " + SVN + " ]]; then echo 'svn could not be found or executed'; fi"
Popen(str, shell=True)

答案 2 :(得分:1)

没有必要使用哪个,你可以尝试在没有参数的情况下运行svn,如果它工作就意味着它就在那里。

try:
    SVN = subprocess.Popen('svn')
    SVN.wait()
    print "svn exists"
except OSError:
    print "svn does not exist"