Python - 函数无法在新线程中运行

时间:2013-01-20 20:05:00

标签: python multithreading wmi

我正试图使用​​此函数终止Windows上的notepad.exe进程:

import  thread, wmi, os
print 'CMD: Kill command called'
def kill():
    c = wmi.WMI ()
    Commands=['notepad.exe']

    if Commands[0]!='All':
        print 'CMD: Killing: ',Commands[0]
        for process in c.Win32_Process ():
          if process.Name==Commands[0]:
              process.Terminate()
    else:
        print 'CMD: trying to kill all processes'
        for process in c.Win32_Process ():
            if process.executablepath!=inspect.getfile(inspect.currentframe()):           
                try:
                    process.Terminate()
                except:
                    print 'CMD: Unable to kill: ',proc.name

kill() #Works               
thread.start_new_thread( kill, () ) #Not working

当我调用这样的函数时,它就像一个魅力:

kill()

但是当在新线程中运行该函数时,它会崩溃,我不知道为什么。

2 个答案:

答案 0 :(得分:6)

import  thread, wmi, os
import pythoncom
print 'CMD: Kill command called'
def kill():
    pythoncom.CoInitialize()
    . . .

在线程中运行Windows函数可能很棘手,因为它通常涉及COM对象。使用pythoncom.CoInitialize()通常允许您这样做。另外,您可能需要查看threading库。处理比线程更容易。

答案 1 :(得分:1)

有几个问题(编辑:第二个问题已经解决,自“MikeHunter”开始我的回答,所以我会跳过这个问题):

首先,你的程序在启动线程后立即结束,并带有线程。我认为这不是一个长期问题,因为可能这将成为更大的一部分。为了解决这个问题,您可以通过在脚本末尾添加time.sleep()调用来模拟其他保持程序运行的内容,例如,将5秒作为睡眠长度。

这将允许程序给我们一个有用的错误,在你的情况下是:

CMD: Kill command called
Unhandled exception in thread started by <function kill at 0x0223CF30>
Traceback (most recent call last):
  File "killnotepad.py", line 4, in kill
    c = wmi.WMI ()
  File "C:\Python27\lib\site-packages\wmi.py", line 1293, in connect
    raise x_wmi_uninitialised_thread ("WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex]")
wmi.x_wmi_uninitialised_thread: <x_wmi: WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex] (no underlying exception)>

正如您所看到的,这揭示了真正的问题,并引导我们找到MikeHunter发布的解决方案。