Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用这个bash测试构造?_Python_Bash_Subprocess - Fatal编程技术网

如何在Python中使用这个bash测试构造?

如何在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

我有一个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)
这不起作用,因为虽然我在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