Python中调用其他程序的方式详解


Posted in Python onAugust 06, 2019

前言

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

可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数。下面介绍4种方式:

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'))

2、ShellExecute函数

使用win32api模块中的ShellExecute()函数来运行其他程序,格式如下

  • ShellExecute(hwnd, op, file, args, dir, show)
  • hwnd: 父窗口的句柄,如果没有父窗口,则为0
  • op : 要运行的操作,为open,print或者为空
  • file: 要运行的程序,或者打开的脚本
  • args: 要向程序传递的参数,如果打开的是文件则为空
  • dir : 程序初始化的目录
  • show: 是否显示窗口

使用ShellExecute函数,就相当于在资源管理器中双击文件图标,系统会打开相应程序运行。

引用win32api,需要安装 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

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 创建程序的属性

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)

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

使用ctypes模块可以让Python调用位于动态链接库的函数。

ctypes模块为Python提供了调用动态链接库中函数的功能。使用ctypes模块可以方便地调用由C语言编写的动态链接库,并向其传递参数。

ctypes模块定义了C语言中的基本数据类型,并且可以实现C语言中的结构体和联合体。ctypes模块可以工作在Windows,Linux,Mac OS等多种操作系统,基本上实现了跨平台。

实例:

Windows下调用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

Python中调用其他程序的方式详解

ctype模块中含有的基本类型与C语言类似,下面是几个基本的数据类型的对照:

Python中调用其他程序的方式详解

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

Python 相关文章推荐
Python 连连看连接算法
Nov 22 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Python中的list与tuple集合区别解析
Oct 12 Python
详解Django admin高级用法
Nov 06 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 #Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 #Python
django将数组传递给前台模板的方法
Aug 06 #Python
Python实现时间序列可视化的方法
Aug 06 #Python
python 模拟银行转账功能过程详解
Aug 06 #Python
Python 3 判断2个字典相同
Aug 06 #Python
django 控制页面跳转的例子
Aug 06 #Python
You might like
xajax写的留言本
2006/11/25 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
Python中的模块和包概念介绍
2015/04/13 Python
python实现网站的模拟登录
2016/01/04 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
外企C语言笔试题
2013/11/10 面试题
为什么要使用servlet
2016/01/17 面试题
电钳专业个人求职信
2014/01/04 职场文书
单位介绍信范文
2014/01/18 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
Python 多线程处理任务实例
2021/11/07 Python
python单向链表实例详解
2022/05/25 Python
MySQL添加索引特点及优化问题
2022/07/23 MySQL
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android