0

以下のように Popen を使用して「RepoInitCmd」を実行しようとしていますが、次のエラーが発生します。何が問題なのかを入力できますか?

import subprocess
Branch_Name='ab_mr2'
RepoInitCmd =  'repo init -u git://git.company.com/platform/manifest.git -b ' + Branch_Name
proc = subprocess.Popen([RepoInitCmd], stderr=subprocess.PIPE)
out, error = proc.communicate()

エラー:-

  File "test.py", line 4, in <module>
    proc = subprocess.Popen([RepoInitCmd], stderr=subprocess.PIPE)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
4

2 に答える 2

1
proc = subprocess.Popen(RepoInitCmd.split(" "), stderr=subprocess.PIPE)

また

import shlex
proc = subprocess.Popen(shlex.split(RepoInitCmd), stderr=subprocess.PIPE)

引数の配列を渡す必要があります。最初の引数はバイナリ名として扱われるため、「repo init ...」が検索対象のプログラムの名前になります。次のようなものを渡す必要があります["repo", "init", ...]

于 2013-07-01T04:08:05.260 に答える
0

デフォルトでは、Popen はコマンドラインがリストとして渡されることを想定しています。特に、実行される実際のコマンド (この場合は「repo」) は、リストの最初の項目である必要があります。コマンドを文字列として記述し、split や shlex を使用してそれらを Popen にリストとして渡すよりも、コマンド ラインを最初からリストとして管理することを好みます。これにより、コマンド ラインをコードで作成しやすくなります。したがって、この場合、次のように書くことができます。

RepoInitCmd = ['repo', 'init', '-u', 'git://git.company.com/platform/manifest.git']
RepoInitCmd.extend(['-b', Branch_Name])
proc = subprocess.Popen(RepoInitCmd, stderr=subprocess.PIPE)

コマンドラインを単一の文字列として渡したい、または渡す必要がある場合 (おそらくシェル機能を利用するため)、追加のシェルプロセスを実行することによる追加のオーバーヘッドが気にならない場合は、シェルモードを有効にできます。

proc  = subprocess.Popen(RepoInitCmd, shell=True, stderr=subprocess.PIPE)
于 2013-07-01T06:16:38.577 に答える