Python调用外部程序的4种核心方法:os、ShellExecute、CreateProcess与ctypes

慢慢来
慢慢来
发布时间:2026-10-13 | 4人浏览过
原创

本文详解Python中调用外部脚本或程序的四种主要方式。首先介绍os模块的system函数,适用于简单命令执行;其次讲解win32api的ShellExecute函数,支持窗口状态控制;接着深入win32process模块的CreateProcess,提供对进程句柄、安全属性及生命周期的精细控制;最后演示利用ctypes模块直接调用C语言动态链接库(如user32.dll),实现跨平台底层交互。

Python调用外部程序的四种核心方法概述

前言

在Python开发中,经常需要在脚本中调用其他可执行程序或脚本,以复用现有功能,避免重复编写代码。

为了实现更精细的控制,除了基础调用外,还可以借助win32process模块管理进程,甚至通过ctype模块直接调用kernel32.dll中的底层函数。本文将依次介绍四种实现方式。

方法一:使用os.system执行简单命令

1、os.system()函数

os模块提供的system()函数是执行外部程序最简便的方法,其基本调用模式如下:

os.system(command):其中command参数指定要执行的命令。若需向脚本传递多个参数,只需在命令字符串中用空格分隔程序名与参数即可。

具体使用示例如下:


#打开记事本
os.system('notepad')
#用记事本打开aa.txt
os.system('notepad aa.txt') #aa.txt文件必须在当前程序目录
#直接打开aa.txt
os.system('aa.txt')
#直接打开Excel文件
os.system('aa.xlsx')
#直接打开Word文件
os.system('bb.docx')
filepath='测试.xlsx'
#打开包含中文的文件
os.system(filepath.decode('utf8').encode('GBK'))

方法二:利用ShellExecute控制窗口状态

2、ShellExecute函数

通过win32api模块提供的ShellExecute()函数,可以启动外部程序,其标准语法格式为:

  • ShellExecute(hwnd, op, file, args, dir, show)
  • hwnd:父窗口句柄,若无父窗口则设为0。
  • op:执行操作类型,可选open、print或留空。
  • file:指定要运行的可执行程序或要打开的脚本文件。
  • args:传递给程序的命令行参数,若仅打开文件则留空。
  • dir:程序启动时的初始工作目录。
  • show:控制是否显示程序窗口。

调用ShellExecute函数的效果类似于在Windows资源管理器中双击文件图标,系统会自动关联并打开相应程序。

使用此功能前需安装pywin32库,下载地址为:https://sourceforge.net/projects/pywin32/files/pywin32/

具体调用示例如下:


import win32api
win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 0)   # 后台执行
win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 1)   # 前台打开
win32api.ShellExecute(0, 'open', 'notepad.exe', 'wmi.txt', '', 1)  # 打开文件
win32api.ShellExecute(0, 'open', 'iexplore.exe', '', '', 1)    # 打开IE浏览器
win32api.ShellExecute(0, 'open', 'iexplore.exe', 'https://www.baidu.com/', '', 1) # 用IE浏览器打开百度网址
win32api.ShellExecute(0, 'open', 'mspaint.exe', 'wxqr.png', '', 1) #用系统附件自带的画图打开图片wxqr.png

方法三:通过CreateProcess精细管理进程

3、CreateProcess

参考实例代码可查阅:https://www.programcreek.com/python/example/8489/win32process.CreateProcess

3.1、创建进程

若需对运行中的程序进行更严格的控制,可使用win32process模块中的CreateProcess()函数来创建进程。该函数的完整格式如下:

CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)

  • appName:指定可执行文件的名称。
  • cmdLine:命令行参数字符串。
  • procAttr:进程的安全属性设置。
  • threadAttr:线程的安全属性设置。
  • InheritHandle:继承标志,决定子进程是否继承父进程句柄。
  • CreationFlags:创建进程时的额外标志位。
  • currentDir:进程启动时的当前目录路径。
  • Attr:创建程序时使用的STARTUPINFO属性对象。

3.2、结束进程

创建进程后,可通过win32process.TerminateProcess函数强制终止进程,其格式为:

TerminateProcess(handle, exitCode)

  • handle:需要操作的进程句柄。
  • exitCode:进程退出时返回的代码。

此外,也可使用win32event.WaitForSingleObject等待创建的线程结束,该函数格式如下:

WaitForSingleObject(handle, milisecond)

  • handle:需要操作的进程句柄。
  • milisecond:等待超时时间(毫秒)。若设置为-1,则表示无限期等待直到进程结束。

import win32process
# 打开记事本,获得其句柄
handle = win32process.CreateProcess(r'C:\Windows\notepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO())
time.sleep(4)
# 终止进程
win32process.TerminateProcess(handle[0], 0)
import win32event
#等待进程结束 
print win32event.WaitForSingleObject(handle[0], -1)

方法四:使用ctypes调用动态链接库

4、使用ctypes调用kernel32.dll中的函数

ctypes模块允许Python直接调用动态链接库(DLL)中的函数。

该模块为Python提供了调用C语言编写的动态链接库的能力,并支持传递参数。

ctypes模块定义了与C语言兼容的基本数据类型,并能处理结构体和联合体。它支持Windows、Linux和Mac OS等多种操作系统,具备良好的跨平台特性。

具体调用示例如下:

在Windows环境下,通过ctypes调用user32.dll中的MessageBoxA函数显示消息框。


from ctypes import *
user32 = windll.LoadLibrary('user32.dll')
a = user32.MessageBoxA(0, str.encode('Hello Ctypes!'), str.encode('Ctypes'), 0)
print a

    

ctype模块中包含的基本数据类型与C语言类似,以下是部分基本数据类型的对照关系:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表