我想也许你不应该使用shell=True
with subprocess.Popen()
。
使用 Windows 7 64 位,在 Cygwin 中运行 Python,我编写了这个简单的测试程序:
import subprocess as sp
p = sp.Popen(['cat', 'junk.bin'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.
PIPE)
stdin, stdout = p.communicate()
with open('junk1.bin', "wb") as f:
f.write(stdin)
对我来说,junk1.bin
是 的字节完美副本junk.bin
,所以我没有看到发生在你身上的"\n"
->转换。"\r\n"
编辑:我发现一个看起来很有用的网页:
http://blog.rubypdf.com/2009/11/03/how-to-let-python-send-binary-data-to-stdout-under-windows/
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
如果子进程继承了父进程的标准输入和标准输出文件句柄的二进制模式设置,那么在您的 Python 父进程中运行上述代码可能会有所帮助?
如果没有,则尝试相同的技巧,但在返回的对象中的stdin
和stdout
句柄上subprocess.Popen()
。在我上面的代码中,我将该对象绑定到名称p
,因此它们将是p.stdin
and p.stdout
:
msvcrt.setmode(p.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(p.stdout.fileno(), os.O_BINARY)
我希望这有帮助。