在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()函數打開系統的記事本程序。
>>> import os
# 使用os.system()函數打開記事本程序
>>> os.system('notepad')
0 # 關閉記事本後的返回值
# 向記事本傳遞參數,打開python.txt文件
>>> 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函數運行其餘程序。
>>> import win32api
# 打開記事本程序,在後臺運行,即顯示記事本程序的窗口
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)
# 打開記事本程序,在前臺運行
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',1)
# 向記事本傳遞參數,打開python.txt
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', 'python.txt','',1)
# 在默認瀏覽器中打開http://www.python.org網站
>>> win32api.ShellExecute(0, 'open', 'http://www.python.org', '','',1)
# 在默認的媒體播放器中播放E:\song.wma
>>> win32api.ShellExecute(0, 'open', 'E:\\song.wma', '','',1)
# 運行位於E:\book\code目錄中的MessageBox.py腳本
>>> 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函數運行記事本程序。
>>> import win32process
>>> win32process.CreateProcess('c:\\windows\\notepad.exe', '',
None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
win32process.STARTUPINFO())
(<?XML:NAMESPACE PREFIX = PYHANDLE />, , 280, 3076)
# 函數返回進程句柄、線程句柄、進程ID,以及線程ID
有了已建立進程的句柄就能夠使用win32process.TerminateProcess函數結束進程,或者使用win32event.WaitForSingleObject等待建立的線程結束。其函數原型分別以下。
TerminateProcess(handle, exitCode)
WaitForSingleObject(handle, milliseconds )
對於TerminateProcess參數含義分別以下。
handle:要操做的進程句柄。
exitCode:進程退出代碼。
對於WaitForSingleObject參數含義分別以下。
handle:要操做的進程句柄。
milliseconds:等待的時間,若是爲1,則一直等待。
如下實例實現建立進程後並對其進行操做。
>>> import win32process
# 打開記事本程序,得到其句柄
>>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe',
'', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None ,
win32process.STARTUPINFO())
# 使用TerminateProcess函數終止記事本程序
>>> win32process.TerminateProcess(handle[0],0)
# 導入win32event模塊
>>> 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 # 進程結束的返回值
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所示。
>>> from ctypes import *
>>> user32 = windll.LoadLibrary('user32.dll') # 加載動態連接庫
>>> user32.MessageBoxA(0, 'Ctypes is cool!', 'Ctypes', 0)
# 調用MessageBoxA函數. python
轉自:http://book.51cto.com/art/200710/58183.htm windows