f = os.popen("gst-launch -q whateversrc ! ... ! fdsink")
f.read(1024);
在 GNU/Linux 上运行良好,但会导致 \x0d\x0a 而不是每个 Windows 的 \x0a。如何解决?
我也尝试了在控制台中gst-launch -q ..... ! matroskamux streamable=true ! fdsink > qqq3.mkv
,qqq3.mkv 也乱码。 gst-launch -q filesrc location=file ! fdsink > file2
也转换为 CRLF。
怎么办?Gstreamer build for Windows 没有 tcp{server,client}sink...
也许有一种方法可以在Windows(或给定的应用程序)中全局关闭LF->CRLF转换?
也许你不应该将shell=True
与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"
> "rn"
转换。
编辑:我发现一个看起来有用的网页:
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)
如果子进程继承了父进程的 stdin 和 stdout 文件句柄的二进制模式设置,那么也许在 Python 父进程中运行上述代码会有所帮助?
如果没有,请尝试相同的技巧,但在subprocess.Popen()
返回的对象中的stdin
和stdout
句柄上。 在上面的代码中,我将该对象绑定到名称p
以便它们p.stdin
并p.stdout
:
msvcrt.setmode(p.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(p.stdout.fileno(), os.O_BINARY)
我希望这有所帮助。