Python系统调用——运行其他程序
Python系統(tǒng)調(diào)用——運(yùn)行其他程序
分類: python and cocos2d 2012-07-12 01:07 1748人閱讀 評(píng)論(0) 收藏 舉報(bào) pythonwindowsimport腳本freebsdcommand 在Python中可以方便地使用os模塊運(yùn)行其他的腳本或者程序,這樣就可以在腳本中直接使用其他腳本,或者程序提供的功能,而不必再次編寫實(shí)現(xiàn)該功能的代碼。為了更好地控制運(yùn)行的進(jìn)程,可以使用win32process模塊中的函數(shù)。如果想進(jìn)一步控制進(jìn)程,則可以使用ctype模塊,直接調(diào)用kernel32.dll中的函數(shù)。
1 使用os.system函數(shù)運(yùn)行其他程序
2 使用ShellExecute函數(shù)運(yùn)行其他程序
3 使用CreateProcess函數(shù)運(yùn)行其他程序
4 使用ctypes調(diào)用kernel32.dll中的函數(shù)
1 使用os.system函數(shù)運(yùn)行其他程序
os模塊中的system()函數(shù)可以方便地運(yùn)行其他程序或者腳本。其函數(shù)原型如下所示。
?????????? os.system(command)
其參數(shù)含義如下所示。
command 要執(zhí)行的命令,相當(dāng)于在Windows的cmd窗口中輸入的命令。如果要向程序或者腳本傳遞參數(shù),可以使用空格分隔程序及多個(gè)參數(shù)。
以下實(shí)例實(shí)現(xiàn)通過os.system()函數(shù)打開系統(tǒng)的記事本程序。
| >>> import os # 使用os.system()函數(shù)打開記事本程序 >>> os.system('notepad') 0 # 關(guān)閉記事本后的返回值 # 向記事本傳遞參數(shù),打開python.txt文件 >>> os.system('notepad python.txt') |
2 使用ShellExecute函數(shù)運(yùn)行其他程序
除了使用os模塊中的os.system()函數(shù)以外,還可以使用win32api模塊中的ShellExecute()函數(shù)。其函數(shù)如下所示。
??????????? ShellExecute(hwnd, op , file , params , dir , bShow )
其參數(shù)含義如下所示。
hwnd:父窗口的句柄,如果沒有父窗口,則為0。
op:要進(jìn)行的操作,為“open”、“print”或者為空。
file:要運(yùn)行的程序,或者打開的腳本。
params:要向程序傳遞的參數(shù),如果打開的為文件,則為空。
dir:程序初始化的目錄。
bShow:是否顯示窗口。
以下實(shí)例使用ShellExecute函數(shù)運(yùn)行其他程序。
>>> import win32api
# 打開記事本程序,在后臺(tái)運(yùn)行,即顯示記事本程序的窗口
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)
# 打開記事本程序,在前臺(tái)運(yùn)行
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', '','',1)
# 向記事本傳遞參數(shù),打開python.txt
>>> win32api.ShellExecute(0, 'open', 'notepad.exe', 'python.txt','',1)
# 在默認(rèn)瀏覽器中打開http://www.python.org網(wǎng)站
>>> win32api.ShellExecute(0, 'open', 'http://www.python.org', '','',1)
# 在默認(rèn)的媒體播放器中播放E:\song.wma
>>> win32api.ShellExecute(0, 'open', 'E:\\song.wma', '','',1)
# 運(yùn)行位于E:\book\code目錄中的MessageBox.py腳本
>>> win32api.ShellExecute(0, 'open', 'E:\\book\\code\\MessageBox.py', '','',1)
可以看出,使用ShellExecute函數(shù),就相當(dāng)于在資源管理器中雙擊文件圖標(biāo)一樣,系統(tǒng)會(huì)打開相應(yīng)的應(yīng)用程序執(zhí)行操作。
3 使用CreateProcess函數(shù)運(yùn)行其他程序
為了便于控制通過腳本運(yùn)行的程序,可以使用win32process模塊中的CreateProcess()函數(shù)。其函數(shù)原型如下所示。
| CreateProcess(appName, commandLine , processAttributes , threadAttributes , bInheritHandles , dwCreationFlags , newEnvironment , currentDirectory , startupinfo ) |
其參數(shù)含義如下。
appName:可執(zhí)行的文件名。
commandLine:命令行參數(shù)。
processAttributes:進(jìn)程安全屬性,如果為None,則為默認(rèn)的安全屬性。
threadAttributes:線程安全屬性,如果為None,則為默認(rèn)的安全屬性。
bInheritHandles:繼承標(biāo)志。
dwCreationFlags:創(chuàng)建標(biāo)志。
newEnvironment:創(chuàng)建進(jìn)程的環(huán)境變量。
currentDirectory:進(jìn)程的當(dāng)前目錄。
startupinfo :創(chuàng)建進(jìn)程的屬性。
以下實(shí)例使用win32process.CreateProcess函數(shù)運(yùn)行記事本程序。
| >>> 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) # 函數(shù)返回進(jìn)程句柄、線程句柄、進(jìn)程ID,以及線程ID |
有了已創(chuàng)建進(jìn)程的句柄就可以使用win32process.TerminateProcess函數(shù)結(jié)束進(jìn)程,或者使用win32event.WaitForSingleObject等待創(chuàng)建的線程結(jié)束。其函數(shù)原型分別如下。
TerminateProcess(handle, exitCode)
WaitForSingleObject(handle, milliseconds )
對(duì)于TerminateProcess參數(shù)含義分別如下。
handle:要操作的進(jìn)程句柄。
exitCode:進(jìn)程退出代碼。
對(duì)于WaitForSingleObject參數(shù)含義分別如下。
handle:要操作的進(jìn)程句柄。
milliseconds:等待的時(shí)間,如果為?1,則一直等待。
以下實(shí)例實(shí)現(xiàn)創(chuàng)建進(jìn)程后并對(duì)其進(jìn)行操作。
| >>> import win32process # 打開記事本程序,獲得其句柄 >>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe', '', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None , win32process.STARTUPINFO()) # 使用TerminateProcess函數(shù)終止記事本程序 >>> win32process.TerminateProcess(handle[0],0) # 導(dǎo)入win32event模塊 >>> import win32event # 創(chuàng)建進(jìn)程獲得句柄 >>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe', '', None , None , 0 ,win32process. CREATE_NO_WINDOW , None , None , win32process.STARTUPINFO()) # 等待進(jìn)程結(jié)束 >>> win32event.WaitForSingleObject(handle[0], -1) 0 # 進(jìn)程結(jié)束的返回值 |
4 使用ctypes調(diào)用kernel32.dll中的函數(shù)
使用ctypes模塊可以使Python調(diào)用位于動(dòng)態(tài)鏈接庫(kù)中的函數(shù)。在Python 2.5版中已經(jīng)包含了ctypes模塊。如果使用其他版本的Python,可以到http://python.net/crew/theller/ctypes網(wǎng)站下載安裝。ctypes適用于Python 2.3版本及以上。
1.ctypes簡(jiǎn)介
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、Windows CE、Mac OS X、Linux、Solaris、FreeBSD、OpenBSD等平臺(tái)上,基本上實(shí)現(xiàn)了跨平臺(tái)。
以下的實(shí)例使用ctypes實(shí)現(xiàn)了在Windows下直接調(diào)用user32.dll中的MessageBoxA函數(shù)。運(yùn)行后如圖10-6所示。
| >>> from ctypes import * >>> user32 = windll.LoadLibrary('user32.dll')???? # 加載動(dòng)態(tài)鏈接庫(kù) >>> user32.MessageBoxA(0, 'Ctypes is cool!', 'Ctypes', 0) # 調(diào)用MessageBoxA函數(shù) |
1
| 498)this.style.width=498;" border=0> |
圖10-6 使用ctypes
2.數(shù)據(jù)類型與結(jié)構(gòu)體
。。。
3.使用kernel32.dll中函數(shù)更改程序流程
。。。
以上來(lái)自——征服Python—語(yǔ)言基礎(chǔ)與典型應(yīng)用
?見:http://book.51cto.com/art/200710/58183.htm
總結(jié)
以上是生活随笔為你收集整理的Python系统调用——运行其他程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解读进化树?
- 下一篇: c运行库、c标准库、windows AP