如何在Python中使用这个bash测试构造?
我有一个bash代码片段要移植到Python。它查找SVN所在的位置以及它是否可执行如何在Python中使用这个bash测试构造?,python,bash,subprocess,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=PI
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)
这不起作用,因为虽然我在Python的本地名称空间中保存了SVN的位置,但我无法从Popen访问它
我还尝试组合成一个Popen对象:
Popen("if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi", shell=True)
但我得到了这个错误(不用说,看起来非常笨拙)
测试构造“-x”是否有Python版本?我认为那将是理想的。其他解决办法也将不胜感激
谢谢这是最简单的解决方案:
path_to_svn = shutil.which('svn')
is_executable = os.access(path_to_svn, os.X_OK)
在Python 3.3中是新的;有一个多边形填充。如果您真的愿意,也可以从Popen
获取路径,但这不是必需的
以下是文档。这是最简单的解决方案:
path_to_svn = shutil.which('svn')
is_executable = os.access(path_to_svn, os.X_OK)
在Python 3.3中是新的;有一个多边形填充。如果您真的愿意,也可以从Popen
获取路径,但这不是必需的
这里是的文档。不需要使用它,您已经可以尝试在没有参数的情况下运行svn,如果它工作,就意味着它在那里
try:
SVN = subprocess.Popen('svn')
SVN.wait()
print "svn exists"
except OSError:
print "svn does not exist"
不需要使用它,您已经可以尝试在没有参数的情况下运行svn,如果它工作,就意味着它在那里
try:
SVN = subprocess.Popen('svn')
SVN.wait()
print "svn exists"
except OSError:
print "svn does not exist"
提供类似于
commands.getoutput(“if[-x myfile]\n then echo true\nfi”)的代码段
。但是,这很难“移植到Python”,因为您仍然在调用Bash。os.stat
可以为您提供有关给定文件的一些信息,例如其权限,但我认为您仍然需要在上面建立一个“当前用户可执行文件”测试,这样就可以将它与变量SVN连接起来?然后将其传递给Popen()…如果找到它,“当前用户的可执行文件”可以使用。提供类似于commands.getoutput(“if[-x myfile]\n then echo true\nfi”)的代码段
。但是,这很难“移植到Python”,因为您仍然在调用Bash。os.stat
可以为您提供有关给定文件的一些信息,例如其权限,但我认为您仍然需要在上面建立一个“当前用户可执行文件”测试,这样就可以将它与变量SVN连接起来?然后将其传递给Popen()…找到它后,“当前用户的可执行文件”可以使用来完成。这是非常低效的,它分叉很多,留下了僵尸进程。这是非常低效的,分叉很多,留下了僵尸进程。os.access()
是多余的<默认情况下,code>shutil.which()已检查X_OK
。os.access()
是冗余的<默认情况下,code>shutil.which()已检查X_OK
。