[问题] 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