<p><code>Popen()</code>只接受真实的文件(至少是有效的<code>.fileno()</code>)。
<a href="https://stackoverflow.com/a/30171588/4279">@Martijn Pieters♦' answer</a>显示了如果您可以一次将所有数据加载到内存中,如何传递数据(另外,<code>jenkins</code>进程直到<code>svn</code>产生<em>all</em>输出才会启动)。在</p>
<p>下面是如何一次读取一行(svn和jenkins进程并行运行):</p>
<pre><code>#!/usr/bine/env python3
from subprocess import Popen, PIPE
with Popen(svn_cmd, stdout=PIPE, bufsize=1, universal_newlines=True) as svn, \
Popen(java_cmd, stdin=PIPE, bufsize=1, universal_newlines=True) as java:
for line in svn.stdout:
line = line.replace('@url@', 'http://localhost/svn/WernerTest/TMS/branches/test1')
java.stdin.write(line)
if java.returncode != 0:
"handle error"
</code></pre>
<p>请参见下面的<code>svn_cmd</code>,<code>java_cmd</code>定义(在Windows上不需要<code>shlex.split(cmd)</code>注意:不<code>shell=True</code>)。在</p>
<hr/>
<p>如果您不需要替换<code>@url@</code>,那么它看起来就像您正在尝试模拟:<code>svn_cmd | java_cmd</code>管道,其中:</p>
^{2}$
<p>最简单的方法就是把贝壳搅得七零八落:</p>
<pre><code>#!/usr/bin/env python
import subprocess
subprocess.check_call(svn_cmd + ' | ' + java_cmd, shell=True)
</code></pre>
<p>您可以在Python中模拟它:</p>
<pre><code>#!/usr/bin/env python3
from subprocess import Popen, PIPE
#NOTE: use a list for compatibility with POSIX systems
with Popen(java_cmd.split(), stdin=PIPE) as java, \
Popen(svn_cmd.split(), stdout=java.stdin):
java.stdin.close() # close unused pipe in the parent
# no more code here (the for-loop is inside an OS code that implements pipes)
if java.returncode != 0:
"handle error here"
</code></pre>
<p>见<a href="https://stackoverflow.com/q/295459/4279">How do I use subprocess.Popen to connect multiple processes by pipes?</a></p>