前言

    在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. TortoiseSVN安装使用【转】

    转自:http://www.cnblogs.com/rushoooooo/archive/2011/04/29/2032346.html TortoiseSVN是windows平台下Subversio ...

  2. malloc和new的区别 begin

    http://blog.csdn.net/miss_acha/article/details/7279915#comments 1.综述 1,malloc与free是C++/C语言的标准库函数,new ...

  3. golang命令行参数解析

    package main import ( "fmt" "os" ) func main(){ s:= os.Args fmt.Println(s) } 直接执 ...

  4. javascript中a标签把href属性设置为“javascript:void(0)”还是会打开空白页面的问题

    在项目中有个位置的点击a标签这里要加一个权限判断,但是之前使用的是js动态添加a标签,href的属性值是一个url,但是我要做权限判断之后,我的url就不能设置在href属性中了,这样的话我可以在a标 ...

  5. KVM(五)libvirt 介绍

    1. Libvirt 是什么 为什么需要Libvirt? Hypervisor 比如 qemu-kvm 的命令行虚拟机管理工具参数众多,难于使用. Hypervisor 种类众多,没有统一的编程接口来 ...

  6. Redis-4.0.8 readme.md

    This README is just a fast *quick start* document. You can find more detailed documentation at [redi ...

  7. ros pcl sensor::pointcloud2 转换成pcl::pointcloud

    #include <pcl_conversions/pcl_conversions.h> #include <pcl/point_types.h> #include <p ...

  8. 将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table

    将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table xxx 新年新气象,果然在新年的第一天就遇到了一个大坑,项目在win上跑的没 ...

  9. spark技术热点问题互动问答2

    决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第3期互动问答分享] Q1: groupbykey是排好序的吗?分组排序怎么实现? groupByKey在一个由(K,V)对组成的数据 ...

  10. POJ 2387 链式前向星下的SPFA

    (POJ)[http://poj.org/problem?id=2387] Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K ...