0

何年も前のこの質問は、私が必要とすることを行います:

Pythonでperforceからファイルをチェックアウトするにはどうすればよいですか?

しかし、サブプロセスモジュールを使用してこれを行う方法はありますか? (私はこれが好ましい方法であることを理解しています)

stdin を使用して必要な入力を p4 プロセスに送信する方法を見つけようとして、stackoverflow、python docs、および多くの Google 検索を調べましたが、成功していません。サブプロセスコマンドの出力をキャプチャすることについてはたくさん見つけることができましたが、入力コマンドを理解することはできませんでした.

私は一般的にPythonにかなり慣れていないので、明らかな何かが欠けている可能性がありますが、この場合、何がわからないのかわかりません。

これは私がこれまでに思いついたコードです:

descr = "this is a test description"
tempIn = tempfile.TemporaryFile()
tempOut = tempfile.TemporaryFile()
p = subprocess.Popen(["p4","change","-i"],stdout=tempOut, stdin=tempIn)
tempIn.write("change: New\n")
tempIn.write("description: " + descr)
tempIn.close()

(out, err) = p.communicate()
print out
4

2 に答える 2

5

コメントで述べたように、Perforce Python API を使用します

あなたのコードについて:

tempfile.TemporaryFile()通常、ファイルを作成してからその内容を別のものに渡すのには適していません。一時ファイルは、ファイルを閉じるとすぐに自動的に削除されます。多くの場合、読み取り用にファイルを再度開く前に、書き込み用にファイルを閉じる必要があり、catch-22 状況が発生します。(これは で回避できますがtempfile.NamedTemporaryFile(delete=False)、この状況ではまだ遠回りです。)

を使用するにはcommunicate()subprocess.PIPE を渡す必要があります:

descr = "this is a test description"
changespec = "change: New\ndescription: " + descr

p = subprocess.Popen(["p4","change","-i"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

(out, err) = p.communicate(changespec)
print out
于 2013-01-11T21:39:30.370 に答える
0

stdoutが無制限でない場合は、 @ Jon-Eric の回答p.communicate()を使用します。それ以外の場合は に置き換えrc = p.wait(); tempOut.seek(0); chunk = tempOut.read(chunk_size) ...ます。

于 2013-01-11T22:16:03.207 に答える