前言

    在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

    

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

    

    

Python中调用其他程序的方式的更多相关文章

  1. 4.1 python中调用rust程序

    概述 使用rust-cpython将rust程序做为python模块调用: 通常为了提高python的性能: 参考 https://github.com/dgrunwald/rust-cpython ...

  2. Python中调用Java程序包

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 开发Python程序,需求中需要用到Java代 ...

  3. PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。

    PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...

  4. 如何在python中调用C语言代码

    1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...

  5. 使用ctypes在Python中调用C++动态库

    使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...

  6. 转 如何在C++中调用C程序

    如何在C++中调用C程序?   C++和C是两种完全不同的编译链接处理方式,如果直接在C++里面调用C函数,会找不到函数体,报链接错误.要解决这个问题,就要在 C++文件里面显示声明一下哪些函数是C写 ...

  7. Python脚本传參和Python中调用mysqldump

    Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...

  8. SQL点滴15—在SQL Server 2008中调用C#程序

    原文:SQL点滴15-在SQL Server 2008中调用C#程序 T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可 ...

  9. python中的三种输入方式

    python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...

随机推荐

  1. python3 生成器表达式

    生成器表达式 [i for i in range(100)] #列表解析 与列表解析的不同是,列表解析用中括号,生成器表达式用小括号 g = (i for i in range(1000)) #生成器 ...

  2. LeetCode 4 Median of Two Sorted Array

    There  are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  3. 跟我一起写 Makefile(一)【转】

    转自:http://blog.csdn.net/haoel/article/details/2886 跟我一起写 Makefile 陈皓 概述—— 什么是makefile?或许很多Winodws的程序 ...

  4. 表单重置 jQuery

    //重置 $('.reset-bottom').click(function(){ $('.mui-input-clear').attr('value','');//text类型 $('input[n ...

  5. TCP,UDP,IP包头格式及说明(zz)

    一.MAC帧头定义 /数据帧定义,头14个字节,尾4个字节/ typedef struct _MAC_FRAME_HEADER { ]; //目的mac地址 ]; //源mac地址 short m_c ...

  6. 【LeetCode】Reverse digits of an integer

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have you ...

  7. Tomcat的类加载机制

     一个功能健全的Web服务器,要解决如下几个问题: 部署在同一个服务器上的两个Web应用程序使用的Java 类库可以实现相互隔离.不能要求一个类库在一个服务器中只有一份,服务器应当保证两个应用程序的类 ...

  8. php判断检测一个数组里有没有重复的值

    php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ...

  9. Web.config中appSettings节点值两种读取方法

        <appSettings>    <add key="ClientPort" value="5252"/>   <add ...

  10. C++-二维vector初始化大小方法-备忘

    来源: C++——二维vector初始化大小方法 1.直接用初始化方法 名字为vec,大小为n*m,初始值为0的二维vector. vector<vector<)); 2.用resize( ...