Manejo de subprocesos en Windows

Estoy ejecutando una secuencia de comandos de Python desde el símbolo del sistema de Windows. Llama a la función a continuación, que convierte un archivo MP3 en un archivo de onda usando LAME .

def convert_mp3_to_wav(input_filename, output_filename): """ converts the incoming mp3 file to wave file """ if not os.path.exists(input_filename): raise AudioProcessingException, "file %s does not exist" % input_filename command = ["lame", "--silent", "--decode", input_filename, output_filename] process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = process.communicate() if process.returncode != 0 or not os.path.exists(output_filename): raise AudioProcessingException, stdout return output_filename 

Desafortunadamente, LAME siempre falla (y hace honor a su nombre) en ciertos archivos MP3. Aparece el cuadro de diálogo “Su progtwig se ha bloqueado” de Windows, que congela mi script. Una vez que cierre el cuadro de diálogo de Windows, se emite la excepción AudioProcessingException. En lugar de tener que decirle a Windows que se calle, me gustaría que el script produjera la excepción y luego pasara al siguiente MP3.

¿Hay alguna manera de evitar esto? Preferiblemente, al modificar el script en lugar de ejecutarlo con Unix.

Estoy usando Windows 7, y Python 2.6

Después de seguir buscando en Google, me topé con este http://www.activestate.com/blog/2007/11/supressing-windows-error-report-messagebox-subprocess-and-ctypes

Se requirió un poco de retoques, pero el método a continuación ahora no recibe mensajes molestos de Windows 🙂 Tenga en cuenta la creación de fallas = subprocess_flags en el subprocess.Popen también

 def convert_mp3_to_wav(input_filename, output_filename): if sys.platform.startswith("win"): # Don't display the Windows GPF dialog if the invoked program dies. # See comp.os.ms-windows.programmer.win32 # How to suppress crash notification dialog?, Jan 14,2004 - # Raymond Chen's response [1] import ctypes SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN ctypes.windll.kernel32.SetErrorMode(SEM_NOGPFAULTERRORBOX); subprocess_flags = 0x8000000 #win32con.CREATE_NO_WINDOW? else: subprocess_flags = 0 """ converts the incoming mp3 file to wave file """ if not os.path.exists(input_filename): raise AudioProcessingException, "file %s does not exist" % input_filename #exec("lame {$tmpname}_o.mp3 -f {$tmpname}.mp3 && lame --decode {$tmpname}.mp3 {$tmpname}.wav"); command = ["lame", "--silent", "--decode", input_filename, output_filename] process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=subprocess_flags) (stdout, stderr) = process.communicate() if process.returncode != 0 or not os.path.exists(output_filename): raise AudioProcessingException, stdout return output_filename