python运行(调用)其他程序或脚本

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()函数打开系统的记事本程序。

  1. >>> import os
  2. # 使用os.system()函数打开记事本程序
  3. >>> os.system('notepad')
  4. 0 # 关闭记事本后的返回值
  5. # 向记事本传递参数,打开python.txt文件
  6. >>> 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函数运行其他程序。

  1. >>> import win32api
  2. # 打开记事本程序,在后台运行,即显示记事本程序的窗口
  3. >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)
  4. # 打开记事本程序,在前台运行
  5. >>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',1)
  6. # 向记事本传递参数,打开python.txt
  7. >>> win32api.ShellExecute(0, 'open', 'notepad.exe', 'python.txt','',1)
  8. # 在默认浏览器中打开http://www.python.org网站
  9. >>> win32api.ShellExecute(0, 'open', 'http://www.python.org', '','',1)
  10. # 在默认的媒体播放器中播放E:\song.wma
  11. >>> win32api.ShellExecute(0, 'open', 'E:\\song.wma', '','',1)
  12. # 运行位于E:\book\code目录中的MessageBox.py脚本
  13. >>> 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函数运行记事本程序。

  1. >>> import win32process
  2. >>> win32process.CreateProcess('c:\\windows\\notepad.exe', '',
  3. None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
  4. win32process.STARTUPINFO())
  5. (<?XML:NAMESPACE PREFIX = PYHANDLE />, , 280, 3076)
  6. # 函数返回进程句柄、线程句柄、进程ID,以及线程ID

有了已创建进程的句柄就可以使用win32process.TerminateProcess函数结束进程,或者使用win32event.WaitForSingleObject等待创建的线程结束。其函数原型分别如下。
TerminateProcess(handle, exitCode)
WaitForSingleObject(handle, milliseconds )
对于TerminateProcess参数含义分别如下。
handle:要操作的进程句柄。
exitCode:进程退出代码。
对于WaitForSingleObject参数含义分别如下。
handle:要操作的进程句柄。
milliseconds:等待的时间,如果为1,则一直等待。
以下实例实现创建进程后并对其进行操作。

  1. >>> import win32process
  2. # 打开记事本程序,获得其句柄
  3. >>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe',
  4. '', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
  5. win32process.STARTUPINFO())
  6. # 使用TerminateProcess函数终止记事本程序
  7. >>> win32process.TerminateProcess(handle[0],0)
  8. # 导入win32event模块
  9. >>> import win32event
  10. # 创建进程获得句柄
  11. >>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe',
  12. '', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
  13. win32process.STARTUPINFO())
  14. # 等待进程结束
  15. >>> win32event.WaitForSingleObject(handle[0], -1)
  16. 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所示。

    1. >>> from ctypes import *
    2. >>> user32 = windll.LoadLibrary('user32.dll') # 加载动态链接库
    3. >>> user32.MessageBoxA(0, 'Ctypes is cool!', 'Ctypes', 0)
    4. # 调用MessageBoxA函数.

python调用其他程序或脚本方法(转)的更多相关文章

  1. Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库的方法详解 投稿:shichen2014 这篇文章主要介绍了Python调用C/C++动态链接库的方法,需要的朋友可以参考下 本文以实例讲解了Python调用C/C ...

  2. Python调用C/C++的种种方法

    Python调用C/C++的种种方法 2010-12-07 09:59 28433人阅读 评论(1) 收藏 Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面 ...

  3. python 调用shell命令三种方法

    #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器: #!/usr/bin/env python这种用法是为了防止操作系统用户没有将pyth ...

  4. java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  5. java本地方法如何调用其他程序函数,方法详解2

    Java调用本地方法(JNI浅谈) (2006-11-27 14:55:36) 转载▼   分类: Java类文章                本人在项目开发实践中的总结和体会     前段时间公司 ...

  6. python 调用内部类的两种方法

    class Car:#外部类 class Door:#内部类 def open(self): print('open door') class Wheel: def run(self): print( ...

  7. 使用JPype实现Python调用JAVA程序

    ''' Created on 2016年6月1日 @author: cero ''' import jpype jvmPath = jpype.getDefaultJVMPath() ext_clas ...

  8. 【Qt】使用QProcess调用其它程序或脚本

    大概试了一下,还是不错的,不过字符编码问题还不太好解决: 代码: #include "mainwindow.h" #include "ui_mainwindow.h&qu ...

  9. python 调用 C++ code

    本文以实例code讲解python 调用 C++的方法. 1. 如果没有参数传递从python传递至C++,python调用C++的最简单方法是将函数声明为C可用函数,然后作为C code被pytho ...

随机推荐

  1. iOS9,导航控制器中的子控制器设置StatusBar状态失效的问题

    iOS9之前控制StatusBar的两种方式: 第一种方式:全局控制StatusBar 1. 在项目的Info.plist文件里设置UIViewControllerBasedStatusBarAppe ...

  2. 图片每天换及纯css3手风琴特效

    <a target="_blank" id="a"><img id="img" /></a> <s ...

  3. windows10的激活及SQL Server 2008 的安装

    在我第一次安装的SQL Server的时候,由于我的电脑是windows8专业版未激活的系统,当时安装的时候,首先出现提示说我电脑缺少了某一个插件,于是乎就下了安装.但是后来又是安装不上,各种问题一一 ...

  4. vs2013安装闪退及vs2010 vs2013打开时提示 未能完成的操作 及vs2013安装时出现图片后闪退

    vs2013打开时提示如上图,vs2010只有  未能完成的操作  这样的提示. 这时.net 4.0开发的程序打开也毫无反应,应该是.net framework出了问题.查看控制面板-卸载程序,发现 ...

  5. 数据结构C语言实现系列——线性表(线性表链接存储(单链表))

    #include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...

  6. android里TextView加下划线的几种方式

    如果是在资源文件里: <resources> <string name="hello"><u>phone:0123456</u>&l ...

  7. HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...

  8. 最长递增子序列LIS再谈

    DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...

  9. BestCoder Round #70 Jam&#39;s math problem(hdu 5615)

    Problem Description Jam has a math problem. He just learned factorization. He is trying to factorize ...

  10. UNIX标准化及实现之限制

    前言 UNIX系统实现定义了很多幻数和常量,其中有很多已被硬编码(关于硬编码和软编码:http://www.cnblogs.com/chenkai/archive/2009/04/10/1432903 ...