大家好,感謝邀請,今天來為大家分享一下trace back to的問題,以及和trace的固定搭配的一些困惑,大家要是還不太明白的話,也沒有關系,因為接下來將為大家分享,希望可以幫助到大家,解決大家的問題,下面就開始吧!
trail和trace的區別
分別是:跡線、小徑的意思.
trace有“某種跡象”的意思.notrace沒有任何跡象.
trail還有拖拉的意思.trailsthin/on/throughtrailV.追蹤;把.拖在后面.N.一連串的痕跡(如一串血漬);一連串的蹤跡(含可看到和可聞到的,如車轍,動物身上的臭味);一排(車);一屢(煙)
traceV.追尋;追溯;回溯(traceback).N.遺跡;痕跡(事件影響的結果,如戰爭留下的痕跡);行跡
subprocess模塊怎么使用
subprocess模塊主要用于創建子進程,并連接它們的輸入、輸出和錯誤管道,獲取它們的返回狀態。通俗地說就是通過這個模塊,你可以在Python的代碼里執行操作系統級別的命令,比如ipconfig、du-sh等。
subprocess模塊替代了一些老的模塊和函數,比如:os.system、os.spawn*等。
subprocess過去版本中的call(),check_call()和check_output()已經被run()方法取代了。run()方法為3.5版本新增。
大多數情況下,推薦使用run()方法調用子進程,執行操作系統命令。在更高級的使用場景,你還可以使用Popen接口。其實run()方法在底層調用的就是Popen接口。
subprocess.run
subprocess.run(args,*,stdin=None,input=None,stdout=None,stderr=None,shell=False,timeout=None,check=False,encoding=None,errors=None)
功能:執行args參數所表示的命令,等待命令結束,并返回一個CompletedProcess類型對象。
注意,run()方法返回的不是我們想要的執行結果或相關信息,而是一個CompletedProcess類型對象。
上面參數表里展示的只是一些常用的,真實情況還有很多。
args:表示要執行的命令,必須是一個字符串,字符串參數列表。
stdin、stdout和stderr:子進程的標準輸入、輸出和錯誤。其值可以是subprocess.PIPE、subprocess.DEVNULL、一個已經存在的文件描述符、已經打開的文件對象或者None。
subprocess.PIPE表示為子進程創建新的管道,subprocess.DEVNULL表示使用os.devnull。默認使用的是None,表示什么都不做。另外,stderr可以合并到stdout里一起輸出。
timeout:設置命令超時時間。如果命令執行時間超時,子進程將被殺死,并彈出TimeoutExpired異常。
check:如果該參數設置為True,并且進程退出狀態碼不是0,則彈出CalledProcessError異常。
encoding:如果指定了該參數,則stdin、stdout和stderr可以接收字符串數據,并以該編碼方式編碼。否則只接收bytes類型的數據。
shell:如果該參數為True,將通過操作系統的shell執行指定的命令。
看下面的例子:
>>>subprocess.run(["ls","-l"])#沒有對輸出進行捕獲CompletedProcess(args=['ls','-l'],returncode=0)>>>subprocess.run("exit1",shell=True,check=True)Traceback(mostrecentcalllast):...subprocess.CalledProcessError:Command'exit1'returnednon-zeroexitstatus1>>>subprocess.run(["ls","-l","/dev/null"],stdout=subprocess.PIPE)CompletedProcess(args=['ls','-l','/dev/null'],returncode=0,stdout=b'crw-rw-rw-1rootroot1,3Jan2316:23/dev/null\n')>>>subprocess.run("python--version",stdout=subprocess.PIPE)CompletedProcess(args='python--version',returncode=0,stdout=b'Python3.6.1\r\n')>>>s=subprocess.run("ipconfig",stdout=subprocess.PIPE)#捕獲輸出>>>print(s.stdout.decode("GBK"))
subprocess.CompletedProcess
run()方法的返回值,表示一個進程結束了。CompletedProcess類有下面這些屬性:
args啟動進程的參數,通常是個列表或字符串。
returncode進程結束狀態返回碼。0表示成功狀態。
stdout獲取子進程的stdout。通常為bytes類型序列,None表示沒有捕獲值。如果你在調用run()方法時,設置了參數stderr=subprocess.STDOUT,則錯誤信息會和stdout一起輸出,此時stderr的值是None。
stderr獲取子進程的錯誤信息。通常為bytes類型序列,None表示沒有捕獲值。
check_returncode()用于檢查返回碼。如果返回狀態碼不為零,彈出CalledProcessError異常。
subprocess.DEVNULL
一個特殊值,用于傳遞給stdout、stdin和stderr參數。表示使用os.devnull作為參數值。
subprocess.PIPE
管道,可傳遞給stdout、stdin和stderr參數。
subprocess.STDOUT
特殊值,可傳遞給stderr參數,表示stdout和stderr合并輸出。
args與shell
args參數可以接收一個類似'du-sh'的字符串,也可以傳遞一個類似['du','-sh']的字符串分割列表。shell參數默認為False,設置為True的時候表示使用操作系統的shell執行命令。
下面我們來看一下兩者的組合結果。
In[14]:subprocess.run('du-sh')---------------------------------------------------------------------------FileNotFoundErrorTraceback(mostrecentcalllast)......FileNotFoundError:[Errno2]Nosuchfileordirectory:'du-sh'In[15]:subprocess.run('du-sh',shell=True)175M.Out[15]:CompletedProcess(args='du-sh',returncode=0)
可見,在Linux環境下,當args是個字符串時,必須指定shell=True。成功執行后,返回一個CompletedProcess對象。
In[16]:subprocess.run(['du','-sh'],shell=True).....大量的數據4./文檔179100.Out[16]:CompletedProcess(args=['du','-sh'],returncode=0)In[17]:subprocess.run(['du','-sh'])175M.Out[17]:CompletedProcess(args=['du','-sh'],returncode=0)
可見,當args是一個['du','-sh']列表,并且shell=True的時候,參數被忽略了,只執行不帶參數的du命令。
總結:Linux中,當args是個字符串是,請設置shell=True,當args是個列表的時候,shell保持默認的False。
獲取執行結果
run()方法返回的是一個CompletedProcess類型對象,不能直接獲取我們通常想要的結果。要獲取命令執行的結果或者信息,在調用run()方法的時候,請指定stdout=subprocess.PIPE。
>>>ret=subprocess.run('dir',shell=True)>>>retCompletedProcess(args='dir',returncode=0)>>>ret=subprocess.run('dir',shell=True,stdout=subprocess.PIPE)>>>retCompletedProcess(args='dir',returncode=0,stdout=b'\xc7\xfd\xb6\xaf\xc6\xf7......')>>>ret.stdoutb'\xc7\xfd\xb6\xaf\xc6\xf7C\xd6\xd0\xb5\xc4\xbe\xed\xca\xc7......'
從例子中我們可以看到,如果不設置stdout=subprocess.PIPE,那么在返回值CompletedProcess(args='dir',returncode=0)中不會包含stdout屬性。反之,則會將結果以bytes類型保存在ret.stdout屬性中。
交互式輸入
并不是所有的操作系統命令都像‘dir’或者‘ipconfig’那樣單純地返回執行結果,還有很多像‘python’這種交互式的命令,你要輸入點什么,然后它返回執行的結果。使用run()方法怎么向stdin里輸入?
這樣?
importsubprocessret=subprocess.run("python",stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)ret.stdin="print('haha')"#錯誤的用法print(ret)
這樣是不行的,ret作為一個CompletedProcess對象,根本沒有stdin屬性。那怎么辦呢?前面說了,run()方法的stdin參數可以接收一個文件句柄。比如在一個1.txt文件中寫入print('ilikePython')。然后參考下面的使用方法:
importsubprocessfd=open("d:\\1.txt")ret=subprocess.run("python",stdin=fd,stdout=subprocess.PIPE,shell=True)print(ret.stdout)fd.close()
這樣做,雖然可以達到目的,但是很不方便,也不是以代碼驅動的方式。這個時候,我們可以使用Popen類。
subprocess.Popen()
用法和參數與run()方法基本類同,但是它的返回值是一個Popen對象,而不是CompletedProcess對象。
>>>ret=subprocess.Popen("dir",shell=True)>>>type(ret)<class'subprocess.Popen'>>>>ret<subprocess.Popenobjectat0x0000000002B17668>
Popen對象的stdin、stdout和stderr是三個文件句柄,可以像文件那樣進行讀寫操作。
>>>s=subprocess.Popen("ipconfig",stdout=subprocess.PIPE,shell=True)>>>print(s.stdout.read().decode("GBK"))
要實現前面的‘python’命令功能,可以按下面的例子操作:
importsubprocesss=subprocess.Popen("python",stdout=subprocess.PIPE,stdin=subprocess.PIPE,shell=True)s.stdin.write(b"importos\n")s.stdin.write(b"print(os.environ)")s.stdin.close()out=s.stdout.read().decode("GBK")s.stdout.close()print(out)
通過s.stdin.write()可以輸入數據,而s.stdout.read()則能輸出數據。
trace back to為什么要加be
當表示被動意義時其前要加be。
tracebackto與datebackto區別
區別就是兩者意思是不一樣,具體的不同如下
tracebackto中文意思是
追溯;追溯到;
例句
AccordingtoplanetaryscientistRobinCanup,allthreeofPluto'ssatellitescouldtracebacktoasingleimpact.
datebackto中文意思是回溯至;
例句
Expertshavecontinuedtopiecetogethertheship'shistoryandbelieveitsconstructioncoulddatebacktothe1770s,duringthetimeoftheRevolutionaryWar.
backtodecember中文什么意
Backtodecember是美國鄉村派歌手TaylorSwift的同名歌曲。
Backtodecember的中文意思是重返12月,將時間撥回到12月。
trace back to和trace的固定搭配的問題分享結束啦,以上的文章解決了您的問題嗎?歡迎您下次再來哦!