這篇文章主要介紹了Python實現運行其他程式的四種方式,結合執行個體形式分析了Python執行其他程式相關模組與函數提示,需要的朋友可以參考下
本文執行個體講述了Python實現運行其他程式的四種方式。分享給大家供大家參考,具體如下:
在Python中,可以方便地使用os模組來運行其他指令碼或者程式,這樣就可以在指令碼中直接使用其他指令碼或程式提供的功能,而不必再次編寫實現該功能的代碼。為了更好地控制啟動並執行進程,可以使用win32process模組中的函數,如果想進一步控制進程,則可以使用ctype模組,直接調用kernel32.dll中的函數.
【方式一】使用os.system()函數運行其他程式
os模組中的system()函數可以方便地運行其他程式或者指令碼,模式如下:
os.system(command)
command: 要執行的命令,如果要向指令碼傳遞參數,可以使用空格分割程式及多個參數。
樣本如下:
>>> import os>>> os.system('notepad') # 開啟記事本程式.0>>> os.system('notepad 1.txt') # 開啟1.txt檔案,如果不存在,則建立.0
【方式二】使用ShellExecute函數運行其他程式
除了使用os.system()函數外,還可以使用win32api模組中的ShellExecute()函數來運行其他程式,格式如下:
ShellExecute(hwnd, op, file, args, dir, show)
hwnd: 父視窗的控制代碼,如果沒有父視窗,則為0
op : 要啟動並執行操作,為open,print或者為空白
file: 要啟動並執行程式,或者開啟的指令碼
args: 要向程式傳遞的參數,如果開啟的是檔案則為空白
dir : 程式初始化的目錄
show: 是否顯示視窗
樣本如下:
>>> import win32api>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 0) # 後台執行>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 1) # 前台開啟>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '1.txt', '', 1) # 開啟檔案>>> win32api.ShellExecute(0, 'open', 'http://www.sohu.com', '', '', 1) # 開啟網頁>>> win32api.ShellExecute(0, 'open', 'D:\\Opera.mp3', '', '', 1) # 播放視頻>>> win32api.ShellExecute(0, 'open', 'D:\\hello.py', '', '', 1) # 運行程式
使用ShellExecute函數,就相當於在資源管理員中雙擊檔案表徵圖,系統會開啟相應程式運行。
NOTE:
win32api安裝 http://sourceforge.net/projects/pywin32/files/pywin32/ 因我的是64的作業系統,所以下載了這個:pywin32-216.win-amd64-py2.7
【方式三】使用ShellExecute函數運行其他程式
建立進程:
為了便於控制通過指令碼啟動並執行程式,可以使用win32process模組中的CreateProcess()函數建立
一個運行相應程式的進程。其函數格式為:
CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)
appName 可執行檔名
cmdLine 命令列參數
procAttr 進程安全屬性
threadAttr 安全執行緒屬性
InheritHandle 繼承標誌
CreationFlags 建立標誌
currentDir 進程的目前的目錄
Attr 建立程式的屬性
樣本如下:
>>> win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW,None, None, win32process.STARTUPINFO())(<PyHANDLE:892>, <PyHANDLE:644>, 21592, 18780) # 函數返回進程控制代碼、線程控制代碼、進程ID以及線程ID
結束進程:
可以使用win32process.TerminateProcess函數來結束已建立的進程, 函數格式如下:
TerminateProcess(handle, exitCode)
handle 要操作的進程控制代碼
exitCode 進程結束代碼
或者使用win32event.WaitForSingleObject等待建立的線程結束,函數格式如下:
WaitForSingleObject(handle, milisecond)
handle : 要操作的進程控制代碼
milisecond: 等待的時間,如果為-1,則一直等待.
樣本如下:
>>> import win32process>>> handle = win32process.CreateProcess('C:\\Windows\\notepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO()) # 開啟記事本,獲得其控制代碼>>> win32process.TerminateProcess(handle[0], 0) # 終止進程
或者
>>> 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 # 進程結束傳回值
【方式四】使用ctypes調用kernel32.dll中的函數
使用ctypes模組可以讓Python調用位於動態連結程式庫的函數。
ctypes模組為Python提供了調用動態連結程式庫中函數的功能。使用ctypes模組可以方便地調用由C語言編寫的動態連結程式庫,並向其傳遞參數。ctypes模組定義了C語言中的基礎資料型別 (Elementary Data Type),並且可以實現C語言中的結構體和聯合體。ctypes模組可以工作在Windows,Linux,Mac OS等多種作業系統,基本上實現了跨平台。
樣本:
Windows下調用user32.dll中的MessageBoxA函數。
>>> from ctypes import *>>> user32 = windll.LoadLibrary('user32.dll')>>> user32.MessageBoxA(0, str.encode('Ctypes is so smart!'), str.encode('Ctypes'), 0)1
ctype模組中含有的基本類型與C語言類似,下面是幾個基本的資料類型的對照:
---------------------------------------
Ctypes資料類型 C資料類型
---------------------------------------
c_char char
c_short short
c_int int
c_long long
c_float float
c_doule double
c_void_p void *
---------------------------------------