Python中四種運行其他程式的方式

來源:互聯網
上載者:User

標籤:python   程式   dll   

在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 *

--------------------------------------- 

Python中四種運行其他程式的方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.