如何解决使用python子进程Popen触摸文件
我是子流程模块的新手,想知道为什么第一个子流程失败而第二个子流程正常工作。我使用的是py3.7和macOS。
>>> from subprocess import PIPE,Popen,STDOUT
>>> Popen(['touch','/Users/me/fail.txt'],stdout=PIPE,stderr=STDOUT,shell=True)
>>> Popen(['touch /Users/me/ok.txt'],shell=True)
解决方法
在subprocess.run
(这是一个高级函数)中,您需要将参数作为列表传递,而对于Popen
(这是一个低级函数),则需要直接命令,因此第一个失败但是第二个有效。
根据docs
:
shell参数(默认为False)指定是否将shell用作要执行的程序。 如果为
df.groupby(['Name']).agg(A = ('A or B',lambda x: (x=='A').sum()),B = ('A or B',lambda x: (x=='B').sum()),total = ('Sales ($)','sum')).reset_index() #output Name A B total 0 Ben 2 1 17 1 Sam 1 2 18
,建议将args作为字符串而不是作为序列传递。在
shell is True
和POSIX
上,shell默认为shell=True
。如果args是字符串,则该字符串指定要通过外壳执行的命令。这意味着该字符串的格式必须与在shell提示符下键入时的格式完全相同。例如,这包括在文件名中使用引号或反斜杠转义。 如果args是序列,则第一项指定命令字符串,任何其他项都将被视为shell本身的其他参数。也就是说,Popen等效于:
/bin/sh
因此,在第一种情况下,列表的第二个元素作为参数传递给Popen(['/bin/sh','-c',args[0],args[1],...])
本身,而不是touch命令。因此,您基本上正在运行:
/bin/sh
哪个会产生以下错误:
user@name ~$ touch
如果您阅读第一个命令的touch: missing file operand
Try 'touch --help' for more information.
,将会发现相同的内容:
stdout
因此,在>>> Popen(['touch','/Users/me/fail.txt'],stdout=PIPE,stderr=STDOUT,shell=True).stdout.read()
b"touch: missing file operand\nTry 'touch --help' for more information.\n"
期间,最好传递字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。