我编写了一个脚本,用于检查SVN Repo是否启动并运行,结果基于返回值。
import subprocess
url = " validurl"
def check_svn_status():
subprocess.call(['svn info'+url],shell=True)
def get_status():
subprocess.call('echo $?',shell=True)
def main():
check_svn_status()
get_status()
if __name__ == '__main__':
main()
我面临的问题是,如果我将url更改为不存在的内容,我仍然会将返回值设置为0,但是如果我在脚本外部运行它,即转到终端类型{ {1}}然后执行svn info wrong url
我得到返回值1.但是我不能在python中重新创建它。任何指导方针?
更新后的TraceBack
echo $?
ý
答案 0 :(得分:4)
为什么您的方法不起作用 你调用两个独立的子shell。第二个shell不知道第一个shell,因此没有关于在第一个shell中执行的进程的返回码的任何信息。
<强>解决方案:强>
使用subprocess
模块,直接生成子进程(不通过子shell)并检索返回码。阅读模块文档:http://docs.python.org/library/subprocess.html
有几种方法可以实现您的目标。一种简单的方法可能是:
import subprocess as sp
p = sp.Popen(['command', 'arg1', 'arg2'], stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = p.communicate()
returncode = p.returncode
这样,您不会通过子shell(默认为shell=False
),这是出于各种原因的推荐方法。您直接捕获生成的子进程的返回码,并且您可以完全访问子进程的标准输出和标准错误。
答案 1 :(得分:0)
subprocess.call返回retcode,只存储subprocess.call(['svn info'+url],shell=True)