Python中調(diào)用其他程序的方式詳解
前言
在Python中,可以方便地使用os模塊來(lái)運(yùn)行其他腳本或者程序,這樣就可以在腳本中直接使用其他腳本或程序提供的功能,而不必再次編寫實(shí)現(xiàn)該功能的代碼。為了更好地控制運(yùn)行的進(jìn)程,
可以使用win32process模塊中的函數(shù),如果想進(jìn)一步控制進(jìn)程,則可以使用ctype模塊,直接調(diào)用kernel32.dll中的函數(shù)。下面介紹4種方式:
1、os.system()函數(shù)
os模塊中的system()函數(shù)可以方便地運(yùn)行其他程序或者腳本,模式如下:
os.system(command):command: 要執(zhí)行的命令,如果要向腳本傳遞參數(shù),可以使用空格分割程序及多個(gè)參數(shù)
實(shí)例:
#打開記事本
os.system('notepad')
#用記事本打開aa.txt
os.system('notepad aa.txt') #aa.txt文件必須在當(dāng)前程序目錄
#直接打開aa.txt
os.system('aa.txt')
#直接打開Excel文件
os.system('aa.xlsx')
#直接打開Word文件
os.system('bb.docx')
filepath='測(cè)試.xlsx'
#打開包含中文的文件
os.system(filepath.decode('utf8').encode('GBK'))
2、ShellExecute函數(shù)
使用win32api模塊中的ShellExecute()函數(shù)來(lái)運(yùn)行其他程序,格式如下
- ShellExecute(hwnd, op, file, args, dir, show)
- hwnd: 父窗口的句柄,如果沒(méi)有父窗口,則為0
- op : 要運(yùn)行的操作,為open,print或者為空
- file: 要運(yùn)行的程序,或者打開的腳本
- args: 要向程序傳遞的參數(shù),如果打開的是文件則為空
- dir : 程序初始化的目錄
- show: 是否顯示窗口
使用ShellExecute函數(shù),就相當(dāng)于在資源管理器中雙擊文件圖標(biāo),系統(tǒng)會(huì)打開相應(yīng)程序運(yùn)行。
引用win32api,需要安裝 pywin32, https://sourceforge.net/projects/pywin32/files/pywin32/
實(shí)例:
import win32api win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 0) # 后臺(tái)執(zhí)行 win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 1) # 前臺(tái)打開 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瀏覽器打開百度網(wǎng)址 win32api.ShellExecute(0, 'open', 'mspaint.exe', 'wxqr.png', '', 1) #用系統(tǒng)附件自帶的畫圖打開圖片wxqr.png
3、CreateProcess
參考實(shí)例:https://www.programcreek.com/python/example/8489/win32process.CreateProcess
3.1、創(chuàng)建進(jìn)程
為了便于控制通過(guò)腳本運(yùn)行的程序,可以使用win32process模塊中的CreateProcess()函數(shù)創(chuàng)建一個(gè)運(yùn)行相應(yīng)程序的進(jìn)程。其函數(shù)格式為:
CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)
- appName 可執(zhí)行文件名
- cmdLine 命令行參數(shù)
- procAttr 進(jìn)程安全屬性
- threadAttr 線程安全屬性
- InheritHandle 繼承標(biāo)志
- CreationFlags 創(chuàng)建標(biāo)志
- currentDir 進(jìn)程的當(dāng)前目錄
- Attr 創(chuàng)建程序的屬性
3.2、結(jié)束進(jìn)程
可以使用win32process.TerminateProcess函數(shù)來(lái)結(jié)束已創(chuàng)建的進(jìn)程, 函數(shù)格式如下:
TerminateProcess(handle, exitCode)
- handle 要操作的進(jìn)程句柄
- exitCode 進(jìn)程退出代碼
或者使用win32event.WaitForSingleObject等待創(chuàng)建的線程結(jié)束,函數(shù)格式如下:
WaitForSingleObject(handle, milisecond)
- handle : 要操作的進(jìn)程句柄
- milisecond: 等待的時(shí)間,如果為-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) # 終止進(jìn)程 win32process.TerminateProcess(handle[0], 0) import win32event #等待進(jìn)程結(jié)束 print win32event.WaitForSingleObject(handle[0], -1)
4、使用ctypes調(diào)用kernel32.dll中的函數(shù)
使用ctypes模塊可以讓Python調(diào)用位于動(dòng)態(tài)鏈接庫(kù)的函數(shù)。
ctypes模塊為Python提供了調(diào)用動(dòng)態(tài)鏈接庫(kù)中函數(shù)的功能。使用ctypes模塊可以方便地調(diào)用由C語(yǔ)言編寫的動(dòng)態(tài)鏈接庫(kù),并向其傳遞參數(shù)。
ctypes模塊定義了C語(yǔ)言中的基本數(shù)據(jù)類型,并且可以實(shí)現(xiàn)C語(yǔ)言中的結(jié)構(gòu)體和聯(lián)合體。ctypes模塊可以工作在Windows,Linux,Mac OS等多種操作系統(tǒng),基本上實(shí)現(xiàn)了跨平臺(tái)。
實(shí)例:
Windows下調(diào)用user32.dll中的MessageBoxA函數(shù)。
from ctypes import *
user32 = windll.LoadLibrary('user32.dll')
a = user32.MessageBoxA(0, str.encode('Hello Ctypes!'), str.encode('Ctypes'), 0)
print a
ctype模塊中含有的基本類型與C語(yǔ)言類似,下面是幾個(gè)基本的數(shù)據(jù)類型的對(duì)照:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pandas之read_csv()讀取文件跳過(guò)報(bào)錯(cuò)行的解決
這篇文章主要介紹了Pandas之read_csv()讀取文件跳過(guò)報(bào)錯(cuò)行的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢(shì)
這篇文章主要介紹了Python一鍵轉(zhuǎn)Jar包,Java調(diào)用Python新姿勢(shì),本文通過(guò)截圖實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
基于Python實(shí)現(xiàn)剪切板實(shí)時(shí)監(jiān)控方法解析
這篇文章主要介紹了基于Python實(shí)現(xiàn)剪切板實(shí)時(shí)監(jiān)控方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
安裝Qbot并且用vscode進(jìn)行配置的詳細(xì)步驟
文章介紹了如何在Python 3.8環(huán)境下使用conda創(chuàng)建虛擬環(huán)境并安裝Qbot項(xiàng)目,本文分步驟結(jié)合圖文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
python3實(shí)現(xiàn)windows下同名進(jìn)程監(jiān)控
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)windows下同名進(jìn)程監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Pytorch 實(shí)現(xiàn)計(jì)算分類器準(zhǔn)確率(總分類及子分類)
今天小編就為大家分享一篇Pytorch 實(shí)現(xiàn)計(jì)算分類器準(zhǔn)確率(總分類及子分類),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python基于itchat實(shí)現(xiàn)微信群消息同步機(jī)器人
本篇文章主要介紹了python基于itchat實(shí)現(xiàn)微信群消息同步機(jī)器人,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02

