Ⅰ python 中os.system和commands.getoutput的區別
1. 使用os.system("cmd")
這是最簡單的一種方法,特點是執行的時候程序會打出cmd在linux上執行的信息。使用前需要import os。
[python]
os.system("ls")
2. 使用Popen模塊產生新的process
現在大部分人都喜歡使用Popen。Popen方法不會列印出cmd在linux上執
行的信息。的確,Popen非常強大,支持多種參數和模式。使用前需要from subprocess import Popen,
PIPE。但是Popen函數有一個缺陷,就是它是一個阻塞的方法。如果運行cmd時產生的內容非常多,函數非常容易阻塞住。解決辦法是不使用
wait()方法,但是也不能獲得執行的返回值了。
Popen原型是:
[python]
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
參數bufsize:指定緩沖。我到現在還不清楚這個參數的具體含義,望各個大牛指點。
參數executable用於指定可執行程序。一般情況下我們通過args參數來設置所要運行的程序。如果將參數shell設為 True,executable將指定程序使用的shell。在windows平台下,默認的shell由COMSPEC環境變數來指定。
參數stdin, stdout, stderr分別表示程序的標准輸入、輸出、錯誤句柄。他們可以是PIPE,文件描述符或文件對象,也可以設置為None,表示從父進程繼承。
參數preexec_fn只在Unix平台下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用。
參數Close_sfs:在windows平台
下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管
道。我們不能將close_fds設置為True同時重定向子進程的標准輸入、輸出與錯誤(stdin, stdout, stderr)。
如果參數shell設為true,程序將通過shell來執行。
參數cwd用於設置子進程的當前目錄。
參數env是字典類型,用於指定子進程的環境變數。如果env = None,子進程的環境變數將從父進程中繼承。
參數Universal_newlines:不同操作系統下,文本的換行符是不一樣的。如:windows下用』/r/n』表示換,而Linux下用 『/n』。如果將此參數設置為True,Python統一把這些換行符當作』/n』來處理。
參數startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的CreateProcess()函數,用 於設置子進程的一些屬性,如:主窗口的外觀,進程的優先順序等等。
subprocess.PIPE
在創建Popen對象時,subprocess.PIPE可以初始化stdin, stdout或stderr參數,表示與子進程通信的標准流。
subprocess.STDOUT
創建Popen對象時,用於初始化stderr參數,表示將錯誤通過標准輸出流輸出。
Popen的方法:
Popen.poll()
用於檢查子進程是否已經結束。設置並返回returncode屬性。
Popen.wait()
等待子進程結束。設置並返回returncode屬性。
Popen.communicate(input=None)
與子進程進行交互。向stdin發送數據,或從stdout和stderr中讀取數據。可選參數input指定發送到子進程的參數。
Communicate()返回一個元組:(stdoutdata,
stderrdata)。注意:如果希望通過進程的stdin向其發送數據,在創建Popen對象的時候,參數stdin必須被設置為PIPE。同樣,如
果希望從stdout和stderr獲取數據,必須將stdout和stderr設置為PIPE。
Popen.send_signal(signal)
向子進程發送信號。
Popen.terminate()
停止(stop)子進程。在windows平台下,該方法將調用Windows API TerminateProcess()來結束子進程。
Popen.kill()
殺死子進程。
Popen.stdin
如果在創建Popen對象是,參數stdin被設置為PIPE,Popen.stdin將返回一個文件對象用於策子進程發送指令。否則返回None。
Popen.stdout
如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用於策子進程發送指令。否則返回 None。
Popen.stderr
如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用於策子進程發送指令。否則返回 None。
Popen.pid
獲取子進程的進程ID。
Popen.returncode
獲取進程的返回值。如果進程還沒有結束,返回None。
例如:
[python]
p = Popen("cp -rf a/* b/", shell=True, stdout=PIPE, stderr=PIPE)
p.wait()
if p.returncode != 0:
print "Error."
return -1
3. 使用commands.getstatusoutput方法
這個方法也不會列印出cmd在linux上執行的信息。這個方法唯一的優點是,它不是一個阻塞的方法。即沒有Popen函數阻塞的問題。使用前需要import commands。
例如:
[python]
status, output = commands.getstatusoutput("ls")
還有隻獲得output和status的方法:
[python]
commands.getoutput("ls")
commands.getstatus("ls")
Ⅱ Python commands.getstatusoutput 一直不退出,求教
因為CPython堅持要讓commands模塊為Unix-specific而不打算兼容Windows唄。
>>> import sys
>>> sys.platform
'win32'
>>> from subprocess import getoutput
>>> getoutput('echo')
'ECHO 處於打開狀態。'
Python 2 大概是不會修了。不過它也有 subprocess 模塊!
Ⅲ python怎麼執行shell命令
工具/原料
Python環境
方法/步驟
os.system("The command you want"). 這個調用相當直接,且是同步進行的,程序需要阻塞並等待返回。返回值是依賴於系統的,直接返回系統的調用返回值,所以windows和linux是不一樣的
os.popen(command[,mode[,bufsize]]),
圖中是一個例子.
可以看出,popen方法通過p.read()獲取終端輸出,而且popen需要關閉close().當執行成功時,close()不返回任何值,失敗
時,close()返回系統返回值. 可見它獲取返回值的方式和os.system不同。
使用commands模塊,圖中是一組例子。根據你需要的不同,commands模塊有三個方法可供選擇。getstatusoutput, getoutput, getstatus。
但是,如上三個方法都不是Python推薦的方法,而且在Python3中其中兩個已經消失。Python文檔中目前全力推薦第四個方法,subprocess! subprocess使用起來同樣簡單:
直
接調用命令,返回值即是系統返回。shell=True表示命令最終在shell中運行。Python文檔中出於安全考慮,不建議使用
shell=True。建議使用Python庫來代替shell命令,或使用pipe的一些功能做一些轉義。官方的出發點是好的,不過真心麻煩了很多,
so.... 如果你更關注命令的終端輸出,可以如下圖這樣操作, 同樣很簡單.
Ⅳ 已有Python腳本里設置command line
具體調用方法如下:
可以通過moviepy直接對視頻整體進行處理。
可以通過ffmpeg對視頻進行frame拆解,拆解出來的可以cv2進行圖片的處理。
可以通過ffmpeg的其他指令(需要藉助terminal進行運行的指令對視頻進行處理。因為python的ffmpeg中並沒有對應的封裝好的可以實現終端中對應的庫函數所可以使用的方法。
利用subprocess子進程去執行指令,這個函數類似網路模型構建中的那種函數,參數很多,但是在一般調用的過程中必要的參數args是要調用的指令的字串,shell=True。
Ⅳ python commands 需要導入 哪個模塊
要獲得shell命令的輸出只需要`cmd`就可以了,
需要得到命令執行的狀態則需要判斷$?的值, 在Python中有一個模塊commands也很容易做到以上的效果.
看一下三個函數:
1). commands.getstatusoutput(cmd)
用os.popen()執行命令cmd, 然後返回兩個元素的元組(status, result). cmd執行的方式是{ cmd ; } 2>&1, 這樣返回結果裡面就會包含標准輸出和標准錯誤.
2). commands.getoutput(cmd)
只返回執行的結果, 忽略返回值.
3). commands.getstatus(file)
返回ls -ld file執行的結果.
看一下這些函數使用的例子:
>>> import commands
>>> commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> commands.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> commands.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
>>> commands.getoutput('ls /bin/ls')
'/bin/ls'
>>> commands.getstatus('/bin/ls')
'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'
Ⅵ 如何在Python中執行DOS命令
關於python調用cmd命令,主要介紹兩種方式:
一、Python的OS模塊
OS模塊調用CMD命令有兩種方式:os.system(),os.popen()。 都是用當前進程來調用。
1、os.system()
a、簡單粗暴的執行cmd指令
b、返回結果為0表示執行成功,無法獲取命令輸出的內容,本在cmd輸出的內容會直接在控制台輸出。
c、當命令運行結束後接著往下面執行程序(同步阻塞式)。用法如:os.system("ipconfig")。
2、os.popen()
a、能獲取DOS命令輸出的內容。
b、os.popen()返回的是一個file對象,那麼可以跟打開文件一樣操作,r是以讀的方式打開。
c、當命令運行結束後接著往下面執行程序(同步阻塞式)。
注意:os.popen() 方法用於從一個命令打開一個讀寫管道,在Unix,Windows中有效。
用法如:
with os.popen(r"adb devices","r")as f:
text = f.read()
print(text)# cmd輸出結果
二、管道subprocess模塊
a、在當前進程下產生子進程。
b、用wait()函數等待結果(非同步非阻塞式)。
【方法1】
result = subprocess.check_output(r'adb devices') ## 命令執行的輸出結果放到了result里
print(result)
【方法2】
process = subprocess.Popen(r'adb devices',shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
command_output = process.stdout.read().decode('gbk')
print(command_output)
Notices:
有些命令行是非同步執行的不會馬上返回輸出,所以有時候我們要先等這個命令行執行完畢才能從stdout讀出來數據。這個時候要加上
process.wait()
我的GitHub
Ⅶ 在python里什麼函數可以讓後面的指令停止執行
函數內用 return
函數外用 exit()
說明,函數內也可用 exit() 停止後面的指令執行,但這樣會使基於函數的線程出現問題,所以不建議在函數內使用 exit(),函數內如果不想執行指令了,最好用 return 進行結束函數,這樣可以把控制權交給主調函數,而不是退出程序
(7)pythoncommands阻塞擴展閱讀:
return語句是python語言中函數返回的一個值,每個函數都應該有一個返回值,其中,return返回值可以是一個數值,一個字元串,一個布爾值,一個列表,或者函數。
在Python中return函數返回值return,函數中一定要有return返回值才是完整的函數,如果用戶沒有定義Python函數返回值,那麼得到的結果是None對象。