0

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

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

这是我目前在 Python 中使用 subprocess 模块的尝试:

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”?我认为那将是理想的。其他解决方法也将不胜感激。

谢谢

4

3 回答 3

4

这是最简单的解决方案:

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

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

这是os.access.

于 2013-03-11T07:27:09.583 回答
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)
于 2013-03-11T07:22:33.773 回答
1

不需要使用 which,您已经可以尝试不带参数运行 svn,如果它有效,则意味着它就在那里。

try:
    SVN = subprocess.Popen('svn')
    SVN.wait()
    print "svn exists"
except OSError:
    print "svn does not exist"
于 2013-03-11T07:35:25.397 回答