我有一个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”?我认为那将是理想的。其他解决方法也将受到赞赏。
由于
答案 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"