Python调用外部程序的四种方法详解
本文详细解析Python中运行其他程序的四种方式。包括使用os.system执行简单命令,利用win32api.ShellExecute模拟资源管理器操作,通过win32process.CreateProcess精细控制进程生命周期,以及使用ctypes模块直接调用C语言动态链接库。内容涵盖参数说明、代码示例及注意事项,帮助开发者根据需求选择合适方案。
本文介绍Python中实现运行其他程序的四种常用方法,供读者参考学习。
在Python开发中,经常需要调用外部脚本或程序以复用其功能,避免重复编写代码。为了更精细地控制这些外部进程,可以借助win32process模块提供的函数;若需更底层的控制,则可通过ctypes模块直接调用kernel32.dll中的系统函数。
方式一:使用os.system()函数
os模块提供的system()函数可用于执行其他程序或脚本,其基本调用模式如下:
os.system(command)
command参数指定要执行的命令。若需向脚本传递参数,可通过空格分隔程序名及多个参数。
具体调用示例如下:
>>> import os
>>> os.system('notepad') # 打开记事本程序.
0
>>> os.system('notepad 1.txt') # 打开1.txt文件,如果不存在,则创建.
0
方式二:使用ShellExecute函数
除os.system()外,还可使用win32api模块中的ShellExecute()函数来运行程序,其语法格式为:
ShellExecute(hwnd, op, file, args, dir, show)
各参数含义如下: hwnd:父窗口句柄,若无父窗口则设为0。 op:指定操作类型,可选open、print或空字符串。 file:指定要运行的程序或打开的脚本文件。 args:向程序传递的参数,若打开的是文件则留空。 dir:程序初始化时的当前目录。 show:控制是否显示窗口。
具体调用示例如下:
>>> import win32api >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 0) # 后台执行 >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 1) # 前台打开 >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '1.txt', '', 1) # 打开文件 >>> win32api.ShellExecute(0, 'open', 'http://www.sohu.com', '', '', 1) # 打开网页 >>> win32api.ShellExecute(0, 'open', 'D:\\Opera.mp3', '', '', 1) # 播放视频 >>> win32api.ShellExecute(0, 'open', 'D:\\hello.py', '', '', 1) # 运行程序
调用ShellExecute函数的效果类似于在资源管理器中双击文件图标,系统会自动启动相应程序。
注意事项:
安装win32api需访问 http://sourceforge.net/projects/pywin32/files/pywin32/ 。由于作者使用的是64位操作系统,因此下载了对应版本的pywin32-216.win-amd64-py2.7。
方式三:使用CreateProcess创建进程
创建进程步骤:
为了便于对脚本运行的程序进行控制,可以使用win32process模块中的CreateProcess()函数来创建进程。
该函数的格式定义如下:
CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)
参数说明: appName:可执行文件名。 cmdLine:命令行参数。 procAttr:进程安全属性。 threadAttr:线程安全属性。 InheritHandle:继承标志。 CreationFlags:创建标志。 currentDir:进程的当前目录。 Attr:创建程序时的属性设置。
具体调用示例如下:
>>> win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW,
None, None, win32process.STARTUPINFO())
(<PyHANDLE:892>, <PyHANDLE:644>, 21592, 18780) # 函数返回进程句柄、线程句柄、进程ID以及线程ID
结束进程步骤:
可以使用win32process.TerminateProcess函数来终止已创建的进程,其函数格式为:
TerminateProcess(handle, exitCode)
参数说明: handle:需要操作的进程句柄。 exitCode:进程退出时返回的代码。
或者使用win32event.WaitForSingleObject等待创建的线程结束,其函数格式为:
WaitForSingleObject(handle, milisecond)
参数说明: handle:需要操作的进程句柄。 milisecond:等待时间,若设为-1则表示无限期等待。
具体调用示例如下:
>>> import win32process
>>> handle = win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0, win32process
.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO()) # 打开记事本,获得其句柄
>>> win32process.TerminateProcess(handle[0], 0) # 终止进程
或者采用以下等待方式:
>>> import win32event
>>> handle = win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0,
win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO()) # 创建进程获得句柄
>>> win32event.WaitForSingleObject(handle[0], -1) # 等待进程结束
0 # 进程结束返回值
方式四:使用ctypes调用kernel32.dll中的函数
ctypes模块允许Python调用动态链接库中的函数。
ctypes模块为Python提供了调用动态链接库中函数的功能。使用该模块可以方便地调用由C语言编写的动态链接库,并向其传递参数。ctypes模块定义了C语言中的基本数据类型,并支持结构体和联合体的实现。该模块兼容Windows、Linux、Mac OS等多种操作系统,基本实现了跨平台运行。
具体调用示例:
在Windows环境下调用user32.dll中的MessageBoxA函数。
>>> from ctypes import *
>>> user32 = windll.LoadLibrary('user32.dll')
>>> user32.MessageBoxA(0, str.encode('Ctypes is so smart!'), str.encode('Ctypes'), 0)
1

ctypes模块中包含与C语言类似的基本类型,以下是部分基本数据类型的对照表:
--------------------------------------- Ctypes数据类型 C数据类型 --------------------------------------- c_char char c_short short c_int int c_long long c_float float c_doule double c_void_p void * ---------------------------------------
更多关于Python相关内容可查看本站专题:《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









