有没有办法使用python子进程创建一个新的P4更改列表?

时间:2013-01-11 20:50:53

标签: python subprocess perforce

多年前的这个问题符合我的要求:

How do I check out a file from perforce in python?

但有没有办法使用子进程模块执行此操作? (我理解这是首选的方式)

我查看了stackoverflow,python文档,以及许多谷歌搜索试图找到一种方法来使用stdin将所需的输入发送到p4进程,但我没有成功。我已经能够找到很多捕获子进程命令的输出,但是无法识别输入命令。

一般来说我对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

2 个答案:

答案 0 :(得分:5)

正如我在评论中提到的,use the Perforce Python API

关于您的代码:

tempfile.TemporaryFile()通常不适合创建文件,然后将内容传递给其他内容。 The temporary file is automatically deleted as soon as the file is closed.通常你需要关闭文件进行写入才能重新打开它进行阅读,从而创建一个catch-22情境。 (您可以使用tempfile.NamedTemporaryFile(delete=False)解决这个问题,但对于这种情况,这仍然太过分了。)

使用communicate()you need to pass 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

答案 1 :(得分:0)

如果stdout不是无限制,则使用@Jon-Eric's answer,否则将p.communicate()替换为rc = p.wait(); tempOut.seek(0); chunk = tempOut.read(chunk_size) ...