使用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 TruePOSIX上,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" 期间,最好传递字符串。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...