0

我编写了一个脚本来检查 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,但如果我要在脚本之外运行它,即转到终端类型svn info wrong url,然后执行echo $?我得到的返回值为 1。但我无法在 python 中重新创建它。有什么指导方针吗?

更新后的TraceBack

Traceback (most recent call last):
  File "svn_status.py", line 21, in <module>
    main()
  File "svn_status.py", line 15, in main
    check_svn_status()
  File "svn_status.py", line 8, in check_svn_status
    p = sp.Popen(['svn info'], stdout=sp.PIPE, stderr=sp.PIPE)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1202, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or director

是的

4

2 回答 2

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默认情况下),由于各种原因,这是推荐的方法。您可以直接捕获生成的子进程的返回码,并且可以完全访问子进程的标准输出和标准错误。

于 2012-08-30T15:36:04.883 回答
0

subprocess.call 返回 retcode,只存储你的结果subprocess.call(['svn info'+url],shell=True)

http://docs.python.org/library/subprocess.html

于 2012-08-30T15:37:26.800 回答