在IronPython中重现PIPE功能

时间:2011-03-05 05:29:05

标签: python ironpython stdout stdin pipe

我希望那里的一些天才可以帮助我解决这个问题......

我正在使用sox来合并和重新采样一组WAV文件,并将输出直接传输到NeroAACEnc的输入以便编码为AAC格式。

我最初在脚本中运行了该过程,其中包括:

sox.exe d:\audio\1.wav d:\audio\2.wav d:\audio\3.wav -c 1 -r 22050 -t wav - | neroAacEnc.exe -q 0.5 -if - -of test.m4a

这按预期工作。命令行中的“ - ”转换为“管道/重定向输入/输出(stdin / stdout)” - 所以Sox管道输出到stdout,NeroAACEnc从stdin读取,|加入他们。

然后我将整个解决方案迁移到Python,等效命令变为:

from subprocess import call, Popen, PIPE
runwav = Popen(['sox.exe', 'd:\audio\1.wav', 'd:\audio\2.wav', 'd:\audio\3.wav', '-c', '1', '-r', '22050', '-t', 'wav', '-'], shell=False, stdout=PIPE)
runm4b = call(['neroAacEnc.exe', '-q', '0.5', '-if', '-', '-of', 'test.m4a'], shell=False, stdin=runwav.stdout)

这也像魅力一样,完全符合预期。稍微复杂一点,但是嘿:)

现在我必须将其移至IronPython,并且Subprocess模块​​不可用(部分实现,即没有Popen / PIPE支持 - 加上在可能的情况下添加自定义库似乎很愚蠢一个原生的替代品)。 UPDATE 部分模块支持Popen和PIPE,我误读了它。可以从此模块中提取.net / IronPython解决方案的细节(请参阅下面的更新)

我应该在这里提一下,我选择了IronPython而不是C#,因为我现在对Python感到很自在 - 但是,之后有机会再将它移动到C#native,我正在使用IronPython让自己放松:我没有C#或.net经验。

到目前为止,我有以下等效项,它设置了2个进程:

from System.Diagnostics import Process
wav = Process()
wav.StartInfo.UseShellExecute = False
wav.StartInfo.RedirectStandardOutput = True
wav.StartInfo.FileName = 'sox.exe'
wav.StartInfo.Arguments = 'd:\audio\1.wav d:\audio\2.wav d:\audio\3.wav -c 1 -r 22050 -t wav -'       
wav.Start()

m4b = Process()
m4b.StartInfo.UseShellExecute = False
m4b.StartInfo.RedirectStandardInput = True
m4b.StartInfo.FileName = 'neroAacEnc.exe'
m4b.StartInfo.Arguments = '-q 0.5 -if - -of test.m4a'
m4b.Start()

我知道这两个进程开始了(我可以在任务管理器中看到Nero和Sox)但是我无法弄清楚(对于我的生活)是如何将两个输出/输入流串在一起,如与前两个解决方案。我搜索过,所以我想我会问!

如果有人知道:

  1. 如何使用与Python和Commandline版本相同的净结果来连接两个流;或
  2. 更好地实现我想要做的事情。
  3. P.S。基于以上内容的代码示例将是非常棒的:)或者我可以轻松翻译的类似过程的特定代码示例。

    [UPDATE]

    经过考虑,我决定将我的特定情景作为两个单独的过程来处理;将合并的WAV输出到文件,然后使用该文件作为转换的输入。

    但是,可以使用可用的子进程模块here来实现我想要的效果。

1 个答案:

答案 0 :(得分:1)

Windows已命名管道,您可以在IronPython等.NET应用程序中使用它们。翻译VB.NET示例like this one通常很简单。您经常可以找到类似这样的托管库,例如http://www.codeproject.com/KB/threads/dotnetnamedpipespart1.aspx

这是另一个围绕管道api创建包装器的项目。 http://omegacoder.com/?p=101