多年前的这个问题符合我的要求:
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
答案 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) ...
。