在IronPython中重现管道功能

在IronPython中重现管道功能,python,ironpython,stdout,stdin,pipe,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 这一切如期而至。comand行中的“-”翻译为“管道/重定向输入/输出(stdin/

我希望有人能帮我解决这个问题

我正在使用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
这一切如期而至。comand行中的“-”翻译为“管道/重定向输入/输出(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,而子流程模块不可用(部分实现即没有Popen/PIPE支持——另外,在可能有本机替代方案的情况下添加自定义库似乎很愚蠢)更新部分模块支持Popen和PIPE,我看错了。可以从这个模块中提取.net/IronPython解决方案的细节(请参阅下面的更新)

我应该在这里提到,我选择IronPython而不是C,因为我现在对Python很熟悉——不过,以后有可能会将它再次移到C#原生版本,我正在使用IronPython使自己轻松地融入其中:)我没有C#或.net经验

到目前为止,我有以下等价物,用于设置两个流程:

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),但我不知道(在我的一生中)如何将两个输出/输入流串在一起,就像前面两个解决方案一样。我找了又找,所以我想我会问的

如果有人知道:

  • 如何以与Python和命令行版本相同的净结果连接两个流;或
  • 一个更好的方法来实现我想做的事情
  • 另外,基于上述内容的代码示例将非常棒:)或类似过程的特定代码示例,我可以轻松翻译

    [更新]

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


    但是,使用可用的子流程模块可以实现我想要的功能。

    Windows已命名管道,您可以从.NET应用程序(如IronPython)中使用它们。翻译VB.NET示例通常很简单。例如,您经常可以找到这样的托管库


    下面是另一个围绕管道api创建包装器的项目

    Windows有命名管道,您可以从.NET应用程序(如IronPython)中使用它们。翻译VB.NET示例通常很简单。例如,您经常可以找到这样的托管库


    下面是另一个围绕管道api创建包装器的项目

    嗨,迈克尔,谢谢你的回复。我知道我有wav.StandardOutput和m4b.StandardInput可用,但无论我尝试哪种组合,我都看不到它是否起作用;e、 g.我希望它类似于m4b.StandardInput.BaseStream=wav.StandardOutput.BaseStream,但这会引发一个异常。如果您阅读了上面的VB.NET示例,您就不会期望像赋值语句这样简单的语句起作用。进程间通信是复杂的。你可以在类/模块中隐藏复杂性,但首先你需要理解它并使其工作。我确实读过这篇文章,谢谢你的链接。然而,这种复杂性使我相信,一个在命令行和Python中都很简单的过程,必须在.net中有一个类似的解决方案。也许我错了,但我读过很多引用Process类中可用的StandardOutput和StandardInput方法的文章。我会继续搜索,并在找到解决方案时更新我的帖子(无论多么复杂!)。再次感谢。嗨,迈克尔,谢谢你的回复。我知道我有wav.StandardOutput和m4b.StandardInput可用,但无论我尝试哪种组合,我都看不到它是否起作用;e、 g.我希望它类似于m4b.StandardInput.BaseStream=wav.StandardOutput.BaseStream,但这会引发一个异常。如果您阅读了上面的VB.NET示例,您就不会期望像赋值语句这样简单的语句起作用。进程间通信是复杂的。你可以在类/模块中隐藏复杂性,但首先你需要理解它并使其工作。我确实读过这篇文章,谢谢你的链接。然而,这种复杂性使我相信,一个在命令行和Python中都很简单的过程,必须在.net中有一个类似的解决方案。也许我错了,但我读过很多引用Process类中可用的StandardOutput和StandardInput方法的文章。我会继续搜索,并在找到解决方案时更新我的帖子(无论多么复杂!)。再次感谢。IronPython从2.7开始包含完整的子流程实现。IronPython从2.7开始包含完整的子流程实现。