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

看板Linux作者 (曙光)時間2年前 (2021/05/24 19:03), 2年前編輯推噓7(7024)
留言31則, 5人參與, 2年前最新討論串1/1
各位前輩您好,由於不知道要放在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
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.75.220.152 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1621854211.A.0F7.html ※ 編輯: asd24693120 (42.75.220.152 臺灣), 05/24/2021 19:14:06

05/24 19:48, 2年前 , 1F
cwd 是否不在哪?找不到 python script 檔?
05/24 19:48, 1F

05/24 19:48, 2年前 , 2F
改執行 sudo pwd 印出路徑來看看?
05/24 19:48, 2F

05/24 19:48, 2年前 , 3F
還有,文不對題
05/24 19:48, 3F
想請問g大,我路徑印出來了,另外想請問我的標題有哪裡下的不對嗎?我立刻改,謝謝 您指導

05/24 20:15, 2年前 , 4F
文有不對題嗎OAO?
05/24 20:15, 4F

05/24 20:19, 2年前 , 5F
你跟你上面一樣多加個 shell=True 就會動了吧
05/24 20:19, 5F
真的,這樣就可以了,想請問o大為什麼這樣就可以了呢? ※ 編輯: asd24693120 (111.254.58.80 臺灣), 05/24/2021 20:27:58

05/24 21:52, 2年前 , 6F
我沒理解錯的話,你不加 shell=True 的話它會去找檔案名稱
05/24 21:52, 6F

05/24 21:52, 2年前 , 7F
為 'sudo ./sync_ ...' 的程式來執行
05/24 21:52, 7F

05/24 21:53, 2年前 , 8F
加了會真的 invoke 一個 shell 出來跑你給他的指令
05/24 21:53, 8F
原來如此,謝謝o大

05/24 21:58, 2年前 , 9F
推樓上 oToToT 大看出問題癥結點,高手!
05/24 21:58, 9F

05/24 21:58, 2年前 , 10F
這個問題比較像是同個命令能在一般 shell 執行,
05/24 21:58, 10F

05/24 21:58, 2年前 , 11F
但是卻無法執行於 Python 的 subprocess,
05/24 21:58, 11F

05/24 21:58, 2年前 , 12F
另外,錯誤訊息 No such file or directory 跟…
05/24 21:58, 12F

05/24 21:58, 2年前 , 13F
">" 重導向沒有關係,所以我才會覺得文不對題
05/24 21:58, 13F
謝謝g大的建議,因為我也不太曉得要怎麼問才能完美表示出問題,經您這樣說,我大概 知道您的意思了

05/24 22:13, 2年前 , 14F
其實官方說很清楚,預設 shell=False 時候,你帶入的
05/24 22:13, 14F

05/24 22:14, 2年前 , 15F
那個字串會當作要執行時間的程式檔案名稱
05/24 22:14, 15F

05/24 22:15, 2年前 , 16F
你有用 shell 內 io 重導的符號時候,需要用 shell=True
05/24 22:15, 16F
請問io重導是什麼意思呢?

05/24 22:15, 2年前 , 17F
畢竟這些符號只有 shell 可以認識,所以會開啟外部的
05/24 22:15, 17F

05/24 22:16, 2年前 , 18F
shell 程式,把整個字串當命令丟給 shell 執行
05/24 22:16, 18F

05/24 22:17, 2年前 , 19F
shell=True 基本上就等於傳統 os.system() 使用
05/24 22:17, 19F

05/24 22:19, 2年前 , 20F
若你不使用 shell=True 要使用 subprocess.call()
05/24 22:19, 20F

05/24 22:20, 2年前 , 21F
一般就是得改成帶入 ['sudo', './sysnc_to_gps8']
05/24 22:20, 21F

05/24 22:24, 2年前 , 22F
至於 > 123.txt, 可以用 open() 開檔帶入給 stdout 參數
05/24 22:24, 22F
謝謝k大仔細的講解,讓我真的又學到了一課

05/24 22:38, 2年前 , 23F
推樓上講得更清楚
05/24 22:38, 23F

05/25 08:27, 2年前 , 24F
推,樓上解釋道得很清楚
05/25 08:27, 24F
真的很謝謝各位前輩耐心的指導~ ※ 編輯: asd24693120 (111.254.58.80 臺灣), 05/25/2021 08:55:14

05/25 12:20, 2年前 , 25F
ok理解,那不改標題也沒差多少了
05/25 12:20, 25F

05/25 12:31, 2年前 , 26F
io重導向指的是 shell 的 IO Redirection
05/25 12:31, 26F

05/25 12:32, 2年前 , 27F
就是 >、<、2>&1、…、這類的東西
05/25 12:32, 27F

05/25 12:33, 2年前 , 28F
由 shell 幫你重導 stdin/stdout/stderr 到其他 fd 或檔
05/25 12:33, 28F

05/25 12:33, 2年前 , 29F
05/25 12:33, 29F

05/25 12:34, 2年前 , 30F
原來如此,謝謝g大指導

05/25 13:33, 2年前 , 31F
其實就 exec sudo vs exec sh -c sudo 的差別
05/25 13:33, 31F
嗚嗚,b大說的這個我也不是很懂 ※ 編輯: asd24693120 (42.74.31.161 臺灣), 05/26/2021 14:01:16
文章代碼(AID): #1WguW33t (Linux)