转载:http://blog.csdn.net/ssihc0/article/details/7738527

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

1 使用os.system函数运行其他程序

2 使用ShellExecute函数运行其他程序

3 使用CreateProcess函数运行其他程序

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

1 使用os.system函数运行其他程序

os模块中的system()函数可以方便地运行其他程序或者脚本。其函数原型如下所示。

os.system(command)
其参数含义如下所示。

command 要执行的命令,相当于在Windows的cmd窗口中输入的命令。如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。

以下实例实现通过os.system()函数打开系统的记事本程序。

>>> import os

# 使用os.system()函数打开记事本程序

>>> os.system('notepad')

0 # 关闭记事本后的返回值

# 向记事本传递参数,打开Python.txt文件

>>> 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函数运行其他程序。

>>> import win32api
# 打开记事本程序,在后台运行,即显示记事本程序的窗口
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)

# 打开记事本程序,在前台运行
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',1)

# 向记事本传递参数,打开python.txt
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', 'python.txt','',1)

# 在默认浏览器中打开http://www.python.org网站
>>> win32api.ShellExecute(0, 'open', 'http://www.python.org', '','',1)

# 在默认的媒体播放器中播放E:\song.wma
>>> win32api.ShellExecute(0, 'open', 'E:\\song.wma', '','',1)

# 运行位于E:\book\code目录中的MessageBox.py脚本
>>> win32api.ShellExecute(0, 'open', 'E:\\book\\code\\MessageBox.py', '','',1)

可以看出,使用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函数运行记事本程序。

>>>  import win32process

>>> win32process.CreateProcess('c:\\windows\\notepad.exe', '',

None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,

win32process.STARTUPINFO())

(<?XML:NAMESPACE PREFIX = PYHANDLE />, , 280, 3076)

# 函数返回进程句柄、线程句柄、进程ID,以及线程ID

有了已创建进程的句柄就可以使用win32process.TerminateProcess函数结束进程,或者使用win32event.WaitForSingleObject等待创建的线程结束。其函数原型分别如下。

TerminateProcess(handle, exitCode)
WaitForSingleObject(handle, milliseconds )

对于TerminateProcess参数含义分别如下。

handle:要操作的进程句柄。

exitCode:进程退出代码。

对于WaitForSingleObject参数含义分别如下。

handle:要操作的进程句柄。

milliseconds:等待的时间,如果为?1,则一直等待。

以下实例实现创建进程后并对其进行操作。

>>> import win32process

# 打开记事本程序,获得其句柄

>>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe',

'', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,

win32process.STARTUPINFO())

# 使用TerminateProcess函数终止记事本程序

>>> win32process.TerminateProcess(handle[0],0)

# 导入win32event模块

>>> 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  # 进程结束的返回值

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

使用ctypes模块可以使Python调用位于动态链接库中的函数。在Python 2.5版中已经包含了ctypes模块。如果使用其他版本的Python,可以到http://python.net/crew/theller/ctypes网站下载安装。ctypes适用于Python 2.3版本及以上。

1.ctypes简介

ctypes为Python提供了调用动态链接库中函数的功能。使用ctypes可以方便地调用由C语言编写的动态链接库,并向其传递参数。ctypes定义了C语言中的基本数据类型,并且可以实现C语言中的结构体和联合体。ctypes可以工作在Windows、Windows CE、Mac OS X、Linux、Solaris、FreeBSD、OpenBSD等平台上,基本上实现了跨平台。

以下的实例使用ctypes实现了在Windows下直接调用user32.dll中的MessageBoxA函数。运行后如图10-6所示。

>>> from ctypes import *

>>> user32 = windll.LoadLibrary('user32.dll')     # 加载动态链接库

>>> user32.MessageBoxA(0, 'Ctypes is cool!', 'Ctypes', 0)

# 调用MessageBoxA函数

1

498)this.style.width=498;" border=0>

图10-6 使用ctypes

 

以上来自——征服Python—语言基础与典型应用

‍见:http://book.51cto.com/art/200710/58183.htm

Python系统调用——运行其他程序的更多相关文章

  1. Python如何运行程序

    人生苦短,我用Python. 作为一个开发人员,如何写代码是必须要知道的,代码如何运行也是有必要了解的.通过了解代码如何运行,可指导我们写出效率更高的代码.下午看了<Python学习手册> ...

  2. python中的commands模块,执行出错:'{' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    最近发现了python的commands模块,查看了下源码,使用的popen封装的,形成三个函数getstatus(), getoutput(), getstatusoutput() 源码如下: de ...

  3. python简单的监控脚本-利用socket、psutil阻止远程主机运行特定程序

    python简单的监控脚本-利用socket.psutil阻止远程主机运行特定程序 psutil是一个跨平台的库(http://code.google.com/p/psutil/),能够轻松的实现获取 ...

  4. Python中四种运行其他程序的方式

    原文地址:http://blog.csdn.net/jerry_1126/article/details/46584179 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在 ...

  5. python webdriver grid多节点运行webdriver程序

    grid整理: 机制 Hub机器和节点机器上要装jdk和jar包 A机器:hub  中控:用来监控所有节点机的状态 启动命令: java -jar selenium-server-standalone ...

  6. Jenkins构建Python项目提示:'python' 不是内部或外部命令,也不是可运行的程序

    问题描述: jenkin集成python项目,立即构建后,发现未执行成功,查看Console Output 提示:'Python' 不是内部或外部命令,也不是可运行的程序,如下图: 1.在 Windo ...

  7. Python 运行其他程序

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

  8. python 命令行:help(),'more'不是内部或外部命令,也不是可运行的程序或批处理文件

    Python下使用help(dict),显示'more'不是内部或外部命令,也不是可运行的程序或批处理文件,该如何处理? 环境变量设置的问题,进入 Path 的环境变量设置界面,将;%SystemRo ...

  9. 第二章 python如何运行程序

    一.python解释器介绍 Python解释器是一种让程序运行起来的程序.实际上,解释器是代码与机器的计算机硬件之间的软件逻辑层.当Python包安装在机器上后,它包含了一些最小化的组件:一个解释器和 ...

随机推荐

  1. mysql千万级测试1亿数据的分页分析测试

    本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com.cn/s/blog_438308750100im0e.html 有什么问题可以 ...

  2. C#入门教程(一)–.Net平台技术介绍、C#语言及开发工具介绍-打造C#学习教程

    一.什么是.Net平台? .Net平台是微软搭建的技术平台,技术人员在此平台上进行应用的搭建与开发.它提供了运行所必须的环境.NET Framework类库以及CLR(公共语言运行时).好比我们人类的 ...

  3. 网络编辑器插件ckeditor+ckfinder配置

    原帖地址 另外一个 去掉编辑器的下边栏 在config.js中加入: config.removePlugins = 'elementspath'; config.resize_enabled = fa ...

  4. Servlet & JSP - Cookie

    关于 Cookie 的内容,参考 HTTP - Cookie 机制 获取来自客户端的 cookie request.getCookies 方法可以获取来自 HTTP 请求的 cookie,返回的是 j ...

  5. java开发:分享一下使用urlrewrite实现网址的个性访问

    很多网站都有一些比较个性的域名访问方式,如:http://www.xxx.com/u/pp  点开就可以看到pp的个人主页了,这种地址比较容易让人记住,那今天就来讲讲这种技术的实现方式. 1.使用ja ...

  6. winform版简易http服务器

    传人url运行(url以/结尾,例如:http://localhost:8080/web/ 监听这个url// 在浏览器 中输入 http://localhost:8080/web/?name=tes ...

  7. JavaBean之简单应用JSP页面

    JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性.每个属性通常都需要具有相应的setter. getter方法,setter方法称为属性修改器,getter方法称为 属性访 ...

  8. MySQL查询不使用索引汇总

    众所周知,增加索引是提高查询仍然不使用索引,这种情况严重影响性能,这里就简单总结几条如果如果列key均匀分布在1和100之间,下面的查询使用索引就不是很好:select * from table_na ...

  9. C#学习笔记之线程 - 通知Signal

    通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...

  10. AngularJS 的那些内置九种过滤器

    ng内置了九种过滤 1. currency (货币处理) 使用currency可以将数字格式化为货币,默认是美元符号,你可以自己传入所需的符号,例如我传入人民币: {{num | currency : ...