python 启动外部程序四种方法
在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码。为了更好地控制运行的进程,可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数.
【方式一】使用os.system()函数运行其他程序
现在应该是苏北press.popen()这个取代上面的函数,感觉很好用,尤其,程序调用程序,出现黑屏现象
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) # 运行程序
带参数启动ie
win32api.ShellExecute(0, 'open', 程序名, url, 初始化目录, 1)
使用ShellExecute函数,就相当于在资源管理器中双击文件图标,系统会打开相应程序运行。
NOTE:
win32api安装 http://sourceforge.net/projects/pywin32/files/pywin32/ 因我的是64的操作系统,所以下载了这个:pywin32-216.win-amd64-py2.7
【方式三】使用ShellExecute函数运行其他程序
创建进程:
为了便于控制通过脚本运行的程序,可以使用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提供了调用动态链接库中函数的功能。使用ctypes模块可以方便地调用由C语言编写的动态链接库,并向其传递参数。ctypes模块定义了C语言中的基本数据类型,并且可以实现C语言中的结构体和联合体。ctypes模块可以工作在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
总结:个人感觉启动exe还是方法2比较好用,跟鼠标双击差不多,傻瓜调用,应该起来的关联文件都能起来,其他方式会出现一些BUG
python 启动外部程序四种方法的更多相关文章
- Python单例模式的四种方法
在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...
- Python遍历List集合四种方法
这篇文章主要介绍了Python 列表(List) 的四种遍历方法实例 详解的相关资料,需要的朋友可以参考下 分别是:直接遍历对象 通过索引遍历 通过enumerate方法 通过iter方法. 使用Py ...
- Win11怎么启动任务管理器?Win11启动任务管理器的四种方法
Win11怎么启动任务管理器?小编为大家带来了Win11启动任务管理器的四种方法,感兴趣的朋友一起看看吧 任务管理器是Windows系统中一项非常实用的功能.不过在最新版Win11中,右击任务栏启动任 ...
- python QQTableView中嵌入复选框CheckBox四种方法
搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...
- 获取当前页面的所有链接的四种方法对比(python 爬虫)
''' 得到当前页面所有连接 ''' import requests import re from bs4 import BeautifulSoup from lxml import etree fr ...
- linux下配置ip地址四种方法(图文方法)
主要是用第四种方法 (1)Ifconfig命令 第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig ...
- C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...
- 【AS3】Flash与后台数据交换四种方法整理
随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...
- (转载)eclipse插件安装的四种方法
eclipse插件安装的四种方法 Eclipse插件的安装方法 1.在eclipse的主目录(ECLIPSE_HOME, 比如在我的机器上安装的目录是:D:\eclipse)有一个plugins的目录 ...
- linux安装IPython四种方法
IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ...
随机推荐
- Vue声明式渲染、条件与循环、事件绑定、双向绑定及生命周期钩子函数
VUE基础介绍 Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用. -声明式渲染 <div> {{ message }} </ ...
- re相关正则表达式(re.sub、re.I 、re.S、re.M)
re.I 表示忽略大小写 re.S 表示全文匹配 re.M 表示全文拼配行尾段位的字符或者数字,影响^和$ re.sub 表示替换 使用方法: re.sub(pattern, repl, string ...
- Java的流程控制
Scanner对象 next(); 一定要读取到有效字符后才可以结束输入. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉(). 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束 ...
- json for python学习笔记
1.json作用 存储数据与数据传输 2.python中的json可以在代码中用字符串表示,字符串内部类似于字典 如: json1 = '{"name":"Bob&quo ...
- HashMap中的Entry接口
利用Entry接口,快速又方便 import java.util.HashMap; import java.util.Map; public class MapDemo { public static ...
- 关于在html中不能正确的打出字符
由于在html中一些字符不能正确的使用,例如大于号或者小于号,浏览器在解析的过程中会将其误认为标签,那html也是非我们提供了一些预留字符,如下(部分): 1.大于号(>):> 2. ...
- 1004 Counting Leaves (30分)
今天在热心网友的督促下完成了第一道PAT编程题. 太久没有保持训练了,整个人都很懵. 解题方法: 1.读懂题意 2.分析重点 3.确定算法 4.代码实现 该题需要计算每层的叶子节点个数,所以选用BFS ...
- Google Play新功能 让您的应用在Play商店中闪耀
Google Play 商店的商品详情内容是帮助潜在用户了解您应用的功能和价值的最佳方式.您提供的资源和信息 (应用说明.图像和视频) 对用户决定下载应用而言至关重要. 随着越来越多的用户购买移动设备 ...
- 3DMAX2018安装
1.下载3DMAX2018安装包并解压 2.打开解压后的文件点击Setup 选择语言和安装位置点击下一步 安装完成后点击enter a serial number 输入序列号066-66666666, ...
- Java题目集 函数
6-1 汽车类 (20 分) 编写汽车类,其功能有启动(start),停止(stop),加速(speedup)和减速(slowDown),启动和停止可以改变汽车的状态(on/off),初始时状态为 ...