当前位置: 首页 > 面试题库 >

在Windows中处理子进程崩溃

巫马英豪
2023-03-14
问题内容

我正在Windows命令提示符下运行python脚本。它调用下面的函数,该函数使用LAME将MP3文件转换为wave文件。

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

不幸的是,LAME总是在某些MP3上崩溃(并达到其名称)。出现Windows“您的程序已崩溃”对话框,该对话框冻结了我的脚本。关闭窗口对话框后,将引发AudioProcessingException。无需告诉Windows关闭,我只想脚本引发异常,然后转到下一个MP3。

有没有办法解决?最好通过更改脚本而不是在Unix上运行脚本。

我正在使用Windows 7和Python 2.6


问题答案:

经过更多的谷歌搜索后,我偶然发现了这个 http://www.activestate.com/blog/2007/11/supressing-
windows-error-report-messagebox-subprocess-and-
ctypes

它需要一些修补,但是下面的方法现在不会出现令人讨厌的Windows消息:)注意subprocess.Popen中的creationflags =subprocess_flags

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


 类似资料:
  • 我知道子进程是进程,而不是线程。我使用了错误的语义,因为大多数人在谈到“多线程”时都知道您的意图。所以我会把它保留在标题中。 想象一下这样一个场景:使用一个自定义函数或模块,您连续有多个类似和复杂的事情要做。使用所有可用的核心/线程(例如8/16)非常有意义,这就是的目的。 理想情况下,您需要多个同时工作的人员,并向一个控制器发送/从一个控制器发送/回调消息。 node cpool、fork po

  • 问题内容: 我正在尝试编写一个python程序来测试用C编写的服务器。python程序使用以下模块启动已编译的服务器: 这可以正常工作,但是如果python程序由于错误而意外终止,则生成的进程将保持运行状态。我需要一种方法来确保如果python程序意外退出,服务器进程也会被杀死。 更多细节: 仅Linux或OSX操作系统 服务器代码无法以任何方式修改 问题答案: 我需要一个函数来终止该过程: 或许

  • 问题内容: 我想并行化我的Python程序,以便它可以在运行它的机器上使用多个处理器。我的并行化非常简单,程序的所有并行“线程”都是独立的,并将其输出写入单独的文件。我不需要线程交换信息,但是必须知道线程何时完成,因为管道的某些步骤取决于它们的输出。 可移植性很重要,因为我希望它可以在Mac,Linux和Windows上的任何Python版本上运行。考虑到这些限制,哪个是实现此功能的最合适的Pyt

  • 我试图杀死一个. exe与子进程。Popen. 解决方案为: taskkill/im(.exe)/t/f taskkill/pid(.exe)/t/f 由于响应被拒绝访问,因此无法工作。事实上,由于我从子流程运行cmd,我无法获得管理员权限。 我发现一个命令可以从cmd(不作为admin运行)中终止此进程,它是: ... 但当我用子进程运行它时,它会给我“无效查询”。我正在运行的命令是: 4)子过

  • 本文向大家介绍Windows进程崩溃问题的定位方法,包括了Windows进程崩溃问题的定位方法的使用技巧和注意事项,需要的朋友参考一下 Linux上进程崩溃通常会生成core文件,用gdb打开后执行bt命令即可查看堆栈。而在Windows平台上,我们通常会采用MiniDumpWriteDump来进行堆栈转储,而这需要对系统Api有一定的了解和编写一些代码。本文就结合实际项目经验,总结了一种无需编码

  • 主要内容:1. 查看正在运行的进程列表,2. 杀死/终止一个进程,3. 启动一个新的过程在本章中,我们将讨论批处理脚本中涉及的各种进程。 1. 查看正在运行的进程列表 在批处理脚本中,可以使用命令来获取系统中当前正在运行的进程的列表。 语法 以下是命令的选项的说明。 /S system - 指定要连接的远程系统。 /U [domain]user - 指定命令应在其下执行的用户上下文。 /P [password] - 指定给定用户上下文的密码。 提示输入,如果省略。 /M [modul