[問題] ubuntu >導向不能用在subprocess模組

作者: asd24693120 (曙光)   2021-05-24 19:03:29
各位前輩您好,由於不知道要放在linux還是python版,若有錯版我會馬上刪文
當我在terminal執行sudo ./sync_to_gps8 >123.txt時,都能夠順利執行,但因為我需要
用python去統整,所以我使用了python的subprocess 模組,但是當我一樣執行sudo ./sy
nc_to_gps8 >123.txt,卻遇到了這個問題,但我也不知道這是錯在哪裡,希望各位前輩
指導,謝謝各位前輩
正常在terminal執行:
https://i.imgur.com/m3CBuSH.jpg
用subprocess模組執行(發生錯誤):
https://i.imgur.com/y9fmwq9.jpg
程式碼:
https://i.imgur.com/dmIp5Dk.jpg
作者: goldie (阿良)   2021-05-24 19:48:00
cwd 是否不在哪?找不到 python script 檔?改執行 sudo pwd 印出路徑來看看?還有,文不對題
作者: oToToT (屁孩)   2021-05-24 20:15:00
文有不對題嗎OAO?你跟你上面一樣多加個 shell=True 就會動了吧我沒理解錯的話,你不加 shell=True 的話它會去找檔案名稱為 'sudo ./sync_ ...' 的程式來執行加了會真的 invoke 一個 shell 出來跑你給他的指令
作者: goldie (阿良)   2021-05-24 21:58:00
推樓上 oToToT 大看出問題癥結點,高手!這個問題比較像是同個命令能在一般 shell 執行,但是卻無法執行於 Python 的 subprocess,另外,錯誤訊息 No such file or directory 跟…">" 重導向沒有關係,所以我才會覺得文不對題
作者: kenduest (小州)   2021-05-24 22:13:00
其實官方說很清楚,預設 shell=False 時候,你帶入的那個字串會當作要執行時間的程式檔案名稱你有用 shell 內 io 重導的符號時候,需要用 shell=True畢竟這些符號只有 shell 可以認識,所以會開啟外部的shell 程式,把整個字串當命令丟給 shell 執行shell=True 基本上就等於傳統 os.system() 使用若你不使用 shell=True 要使用 subprocess.call()一般就是得改成帶入 ['sudo', './sysnc_to_gps8']至於 > 123.txt, 可以用 open() 開檔帶入給 stdout 參數
作者: oToToT (屁孩)   2021-05-24 22:38:00
推樓上講得更清楚
作者: Typebrook (Pham)   2021-05-25 08:27:00
推,樓上解釋道得很清楚
作者: goldie (阿良)   2021-05-25 12:20:00
ok理解,那不改標題也沒差多少了io重導向指的是 shell 的 IO Redirection就是 >、<、2>&1、…、這類的東西由 shell 幫你重導 stdin/stdout/stderr 到其他 fd 或檔案https://wiki-dev.bash-hackers.org/syntax/redirection
作者: Bencrie   2021-05-25 13:33:00
其實就 exec sudo vs exec sh -c sudo 的差別

Links booklink

Contact Us: admin [ a t ] ucptt.com