zoukankan      html  css  js  c++  java
  • Python调用Windows外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码。为了更好地控制运行的进程,可以使用win32process模块中的函数。

    1 使用os.system函数运行其他程序
    2 使用ShellExecute函数运行其他程序
    3 使用CreateProcess函数运行其他程序

    1 使用os.system函数运行其他程序
    os模块中的system()函数可以方便地运行其他程序或者脚本。其函数原型如下所示。
    os.system(command)
    其参数含义如下所示。
    command 要执行的命令,相当于在Windows的cmd窗口中输入的命令。如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。
    以下实例实现通过os.system()函数打开系统的记事本程序。

    1 >>> import os
    2 # 使用os.system()函数打开记事本程序
    3 >>> os.system('notepad')
    4 0 # 关闭记事本后的返回值
    5 # 向记事本传递参数,打开python.txt文件
    6 >>> os.system('notepad python.txt')
    这种方式非常简单,但是它有个缺点,它是阻塞的,即程序运行到这里后要等执行的程序执行完成后才能继续向下运行

    2 使用ShellExecute函数运行其他程序
    除了使用os模块中的os.system()函数以外,还可以使用win32api模块中的ShellExecute()函数。其函数如下所示。
    ShellExecute(hwnd, op , file , params , dir , bShow )
    其参数含义如下所示。
    hwnd:父窗口的句柄,如果没有父窗口,则为0。
    op:要进行的操作,为“open”、“print”或者为空。
    file:要运行的程序,或者打开的脚本。
    params:要向程序传递的参数,如果打开的为文件,则为空。
    dir:程序初始化的目录。
    bShow:是否显示窗口。
    以下实例使用ShellExecute函数运行其他程序。

     1 >>> import win32api
     2 # 打开记事本程序,在后台运行,即显示记事本程序的窗口
     3 >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)
     4 # 打开记事本程序,在前台运行
     5 >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',1)
     6 # 向记事本传递参数,打开python.txt
     7 >>> win32api.ShellExecute(0, 'open', 'notepad.exe', 'python.txt','',1)
     8 # 在默认浏览器中打开http://www.python.org网站
     9 >>> win32api.ShellExecute(0, 'open', 'http://www.python.org', '','',1)
    10 # 在默认的媒体播放器中播放E:song.wma
    11 >>> win32api.ShellExecute(0, 'open', 'E:\song.wma', '','',1)
    12 # 运行位于E:ookcode目录中的MessageBox.py脚本
    13 >>> win32api.ShellExecute(0, 'open', 'E:\book\code\MessageBox.py', '','',1)

    # 最后一个参数表示是窗口属性,0表示不显示,1表示正常显示,2表示最小化,3表示最大化
    该函数是非阻塞的

    可以看出,使用ShellExecute函数,就相当于在资源管理器中双击文件图标一样,系统会打开相应的应用程序执行操作。

    3 使用CreateProcess函数运行其他程序
    为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数。其函数原型如下所示。
    CreateProcess(appName, commandLine , processAttributes , threadAttributes , bInheritHandles ,dwCreationFlags , newEnvironment , currentDirectory , startupinfo )
    其参数含义如下。
    appName:可执行的文件名。
    commandLine:命令行参数。
    processAttributes:进程安全属性,如果为None,则为默认的安全属性。
    threadAttributes:线程安全属性,如果为None,则为默认的安全属性。
    bInheritHandles:继承标志。
    dwCreationFlags:创建标志。
    newEnvironment:创建进程的环境变量。
    currentDirectory:进程的当前目录。
    startupinfo :创建进程的属性。
    以下实例使用win32process.CreateProcess函数运行记事本程序。

    1 >>> import win32process
    2 >>> win32process.CreateProcess('c:\windows\notepad.exe', '', 
    3 None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
    4 win32process.STARTUPINFO())
    5 (<?XML:NAMESPACE PREFIX = PYHANDLE />, , 280, 3076) 
    6 # 函数返回进程句柄、线程句柄、进程ID,以及线程ID
     

    有了已创建进程的句柄就可以使用win32process.TerminateProcess函数结束进程,或者使用win32event.WaitForSingleObject等待创建的线程结束。其函数原型分别如下。
    TerminateProcess(handle, exitCode)
    WaitForSingleObject(handle, milliseconds )
    对于TerminateProcess参数含义分别如下。
    handle:要操作的进程句柄。
    exitCode:进程退出代码。
    对于WaitForSingleObject参数含义分别如下。
    handle:要操作的进程句柄。
    milliseconds:等待的时间,如果为1,则一直等待。
    以下实例实现创建进程后并对其进行操作。

     1 >>> import win32process
     2 # 打开记事本程序,获得其句柄
     3 >>> handle = win32process.CreateProcess('c:\windows\notepad.exe',
     4 '', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
     5 win32process.STARTUPINFO())
     6 # 使用TerminateProcess函数终止记事本程序
     7 >>> win32process.TerminateProcess(handle[0],0)
     8 # 导入win32event模块
     9 >>> import win32event
    10 # 创建进程获得句柄
    11 >>> handle = win32process.CreateProcess('c:\windows\notepad.exe',
    12 '', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
    13 win32process.STARTUPINFO())
    14 # 等待进程结束
    15 >>> win32event.WaitForSingleObject(handle[0], -1)
    16 0 # 进程结束的返回值

    此函数是非阻塞方式

     
  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/hushaojun/p/9812038.html
Copyright © 2011-2022 走看看