<p>问题是您在命令中使用了shell重定向,但是在使用子进程时没有生成shell。在</p>
<p>考虑以下(非常简单)程序:</p>
<pre><code>import sys
print sys.argv
</code></pre>
<p>现在,如果我们像运行<code>ssh</code>(假设<code>foofile.txt</code>存在),我们得到:</p>
^{pr2}$
<p>请注意,<code>< foofile.txt</code>永远不会使用python的命令行参数。这是因为bash解析器截获<code><</code>及其后的文件,并将该文件的内容重定向到程序的stdin。换句话说,<code>ssh</code>正在从stdin读取文件。您也希望使用python将文件传递到<code>ssh</code>的<code>stdin</code>。在</p>
<pre><code>s = """
ssh x.x.x.x cat '| /path/to/bash/script.sh;'
"""
#<snip>
proc=subprocess.Popen(sbash,stdout=subprocess.PIPE,stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
out,err=proc.communicate(open(fn).read())
</code></pre>
<p>大概能起作用。在</p>
<hr/>
<p>以下是我的工作:</p>
<pre><code>import subprocess
from subprocess import PIPE
with open('foo.h') as f:
p = subprocess.Popen(['ssh','mgilson@XXXXX','cat','| cat'],stdin=f,stdout=PIPE,stderr=PIPE)
out,err = p.communicate()
print out
print '#'*80
print err
</code></pre>
<p>以及<code>bash</code>中的等效命令:</p>
<pre><code>ssh mgilson@XXXXX cat < foo.h '| cat'
</code></pre>
<p>其中<code>foo.h</code>是本地计算机上的一个文件。在</p>