0

SVNリポジトリが稼働しているかどうかをチェックするスクリプトを作成しました。結果は、戻り値に基づいています。

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 urlecho $?戻り値は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

y

4

2 に答える 2

4

アプローチが機能しない理由: 2つの独立したサブシェルを呼び出します。2番目のシェルは最初のシェルを認識していないため、最初のシェルで実行されたプロセスのリターンコードに関する情報はありません。

解決策:モジュール を使用してsubprocess、サブプロセスを直接(サブシェルを介さずに)生成し、戻りコードを取得します。モジュールのドキュメントを読んで自分自身を助けてください:http://docs.python.org/library/subprocess.html

あなたの目標を達成するためのいくつかの方法があります。簡単な方法の1つは次のとおりです。

import subprocess as sp
p = sp.Popen(['command', 'arg1', 'arg2'], stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = p.communicate()
returncode = p.returncode

このように、サブシェル(デフォルト)を通過しません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 に答える