Воспроизведение функциональности PIPE в IronPython - PullRequest
1 голос
/ 05 марта 2011

Я надеюсь, что некоторые гениальные люди могут помочь мне с этим ...

Я использую 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

Это сработало, как и ожидалось.'-' в строке команд переводится как 'Pipe / redirect input / output (stdin / stdout)' - Sox направляет поток на стандартный вывод, а 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 - плюс этокажется глупым добавлять пользовательскую библиотеку, когда есть, вероятно, нативная альтернатива). ОБНОВЛЕНИЕ Частичный модуль поддерживает Popen и PIPE, я его неправильно прочитал.Из этого модуля можно извлечь подробности для решения .net / IronPython (см. Обновление ниже).

Я должен упомянуть здесь, что я выбрал IronPython вместо C #, потому что сейчас мне удобно с Python - однако, есть шанс переместить его позже на родной C #, и я использую 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()

Я знаю, что эти 2 процесса запускаются (я могу видеть Nero и Sox ​​в диспетчере задач), но что я не могу понять (для моей жизни), так этокак связать два потока ввода / вывода вместе, как в предыдущих двух решениях.Я искал и искал, так что я подумал:

Если кто-нибудь знает:

  1. Как объединить два потока с одинаковым результатом, как Python и Commandlineверсии;или
  2. Лучший способ добиться того, что я пытаюсь сделать.

PS Пример кода, основанный на вышеизложенном, был бы замечательным :) или конкретный пример кода аналогичного процессачто я могу легко перевести.

[ОБНОВЛЕНИЕ]

После рассмотрения я решил рассматривать мой конкретный сценарий как два отдельных процесса;вывести объединенные файлы WAV в файл, а затем использовать этот файл в качестве входных данных для преобразования.

Однако можно получить то, что я хотел, используя доступный модуль подпроцесса здесь .

1 Ответ

1 голос
/ 05 марта 2011

Windows имеет именованные каналы, и вы можете использовать их из приложений .NET, таких как IronPython. Обычно просто переводить примеры VB.NET как этот . Часто можно найти управляемые библиотеки для таких вещей, как, например, http://www.codeproject.com/KB/threads/dotnetnamedpipespart1.aspx

Вот еще один проект по созданию обертки вокруг API трубы. http://omegacoder.com/?p=101

...