當前位置:成語大全網 - 書法字典 - python中os.system和commands.getoutput的區別

python中os.system和commands.getoutput的區別

1.使用操作系統系統(“cmd”)

這是最簡單的方法,它的特點是在執行時,程序會打印出在linux上執行cmd的信息。使用前需要導入操作系統。

[python]

操作系統(“ls”)

2.使用Popen模塊生成新流程。

現在大部分人都喜歡用Popen。Popen方法不會打印出cmd是在linux上執行的。

線路信息。的確,Popen非常強大,支持多種參數和模式。使用前需要從子流程導入Popen。

煙鬥.但是Popen函數有壹個缺陷,就是它是壹個阻塞方法。如果運行cmd時產生大量內容,該功能非常容易被屏蔽。解決方法是不使用

Wait()方法,但也無法獲得執行的返回值。

Popen的原型是:

[python]

子流程。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,可執行文件將指定程序使用的shell。在windows平臺上,缺省shell由COMSPEC環境變量指定。

參數stdin、stdout、stderr分別代表程序的標準輸入、輸出和錯誤句柄。它們可以是管道、文件描述符或文件對象,也可以設置為None,這意味著它們是從父進程繼承的。

參數preexec_fn只在Unix平臺下有效,用於指定壹個可執行對象,在子進程運行前會調用該對象。

參數Close_sfs:在windows平臺上。

如果close_fds設置為True,新創建的子流程將不會繼承父流程的輸入、輸出和錯誤管理。

陶。我們不能將close_fds設置為True來同時重定向子流程的標準輸入、輸出和錯誤(stdin、stdout、stderr)。

如果參數shell設置為true,程序將通過shell執行。

參數cwd用於設置子流程的當前目錄。

參數env是壹個字典類型,用於指定子流程的環境變量。如果env = None,子進程的環境變量將從父進程繼承。

參數Universal_newlines:不同操作系統下文本的換行符不同。例如,'/r/n '用於windows,而'/n '用於Linux。如果此參數設置為True,Python會將這些換行符統壹視為'/n '。

參數startupinfo和createionflags只在windows下起作用,它們會被傳遞給底層的CreateProcess()函數來設置子進程的壹些屬性,比如主窗口的外觀,進程的優先級等等。

子流程。管

創建Popen對象時,子進程。PIPE可以初始化stdin、stdout或stderr參數,以表示與子進程通信的標準流。

子流程。標準輸出

創建Popen對象時,它用於初始化stderr參數,指示錯誤通過標準輸出流輸出。

波普方法:

Popen.poll()

用於檢查子流程是否已經結束。設置並返回returncode屬性。

Popen.wait()

等待子流程結束。設置並返回returncode屬性。

Popen.communicate(輸入=無)

與子流程交互。向stdin發送數據或從stdout和stderr讀取數據。可選的參數輸入指定發送給子進程的參數。

Communicate()返回壹個元組:(stdoutdata,

stderrdata).註意:如果要通過進程的stdin向進程發送數據,那麽在創建Popen對象時,必須將參數stdin設置為PIPE。類似的,比如

如果要從stdout和stderr獲取數據,必須將stdout和stderr設置為PIPE。

Popen.send_signal(信號)

向子進程發送信號。

Popen.terminate()

停止子進程。在windows平臺下,這個方法會調用Windows API TerminateProcess()來結束子進程。

Popen.kill()

殺死子進程。

Popen.stdin

如果創建了Popen對象,則參數stdin設置為PIPE,Popen.stdin將返回壹個file對象,供子進程發送指令。否則不返回任何內容。

Popen.stdout

如果創建了Popen對象,則參數stdout設置為PIPE,Popen.stdout將返回壹個file對象,供子進程發送指令。否則不返回任何內容。

Popen.stderr

如果創建了Popen對象,則參數stdout設置為PIPE,Popen.stdout將返回壹個file對象,供子進程發送指令。否則不返回任何內容。

Popen.pid

獲取子進程的進程ID。

Popen.returncode

獲取進程的返回值。如果進程沒有完成,則返回None。

例如:

[python]

p = Popen("cp -rf a/* b/",shell=True,stdout=PIPE,stderr=PIPE)

p .等待()

if p.returncode!= 0:

打印“錯誤”

return -1

3.使用commands.getstatusoutput方法

這個方法不會打印出在linux上執行cmd的信息。這種方法的唯壹優點是它不是壹種阻塞方法。也就是不存在Popen函數阻塞的問題。使用前需要導入命令。

例如:

[python]

status,output = commands . getstatusoutput(" ls ")

還有壹些方法只獲取輸出和狀態:

[python]

commands.getoutput("ls ")

commands.getstatus("ls ")