簡體   English   中英

盡管在python子進程中提供了stderr = PIPE,但仍將輸出拋出到外部

[英]Throws output outside, despite giving stderr=PIPE in python subprocess

    str = "blah -l"
    cpuinfo = subprocess.Popen(str.split(),stdout=PIPE,stderr=PIPE)

    tuples = cpuinfo.communicate()

在上面的代碼中,當我給出str = [some_valid_command]時,將輸出提供給元組。 當我發出無效命令時,我希望該錯誤將帶給PIPE,但仍會在控制台上拋出該錯誤。...我不太確定,我在哪里理解錯了...。

謝謝.....

我不確定您是否看到stderr實際上出現在控制台上,還是只是在運行Python失敗時才生成名為“ blah”的進程,該進程是在運行您提供的示例時產生的...

該示例的輸出將是Python引發OSError: [Errno 2] No such file or directory ,除非您在PATH中有一個名為“ blah”的可執行腳本,否則這是不希望的。

我做了一個簡單的測試,並編寫了一個bash腳本,如下所示:

#!/bin/bash

echo "This is stdout"
echo "This is a failure on stderr" >&2
exit 1

在授予該腳本可執行文件權限之后,我重復了您的示例,但這樣稱呼我的腳本(在本地目錄中名為fail.sh):

import subprocess

cmd = './fail.sh'
proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

按預期返回此結果('This is stdout\\n', 'This is a failure on stderr\\n')

因此,也許您真正在這里看到的是您要調用的任何程序(如果不是這樣的話)都根本不存在於PATH中。

還要注意在Python中使用str作為標簽的注意事項: str是內置類型,不應用作變量或函數的名稱,除非您特別想“重載”內置函數。 string也是一個類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM