[英]Python subprocess.call fails on windows without shell=True
[英]How to do this Python subprocess call without using shell=True?
例如,在/ tmp中,我想以.txt,.doc和.jpg结尾的文件可以通过粉碎和子处理一步一步地删除。
以下是工作:
subprocess.call('bash -c "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"', shell=True)
我如何不使用shell = True来执行此命令。 我尝试了以下方法:
subprocess.call(['bash', '-c', '"shred -n 10 -uz /tmp/{*.txt,*.pdf,*.doc}"'])
subprocess.call(['bash', '-c', 'shred', '-n 10', '-uz', '/tmp/{*.txt,*.pdf,*.doc}'])
有什么建议么?
我相信有其他人在现场(虽然我自己没有尝试过)。 但是,如果再次遇到类似问题,则shlex.split(s)可能会有所帮助。 它采用字符串“ s”,并“使用类似于shell的语法”将其拆分。
In [3]: shlex.split(s)
Out[3]: ['bash', '-c', 'shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}']
subprocess.call(['bash', '-c', 'shred -n 10 -uz /tmp/{*.txt,*.pdf,*.doc}'])
您可以通过以下命令知道如何扩展和拆分命令:
$ printf "Argument: %s\n" bash -c "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"
Argument: bash
Argument: -c
Argument: shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}
在更一般的情况下(这里是过度杀伤力),如果您不确定带有参数的对象执行的操作,可以使用strace:
$ cat script
import subprocess
subprocess.call('bash -c "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"', shell=True)
$ strace -s 1000 -fe execve python script
...
execve("/bin/bash", ["bash", "-c", "shred -n 5 -uz /tmp/{*.txt,*.pdf,*.doc}"], [/* 49 vars */]) = 0
...
$
如果命令来自可信来源,例如,它是经过硬编码的,那么使用shell=True
并没有错:
#!/usr/bin/env python
from subprocess import check_call
check_call("shred -n 10 -uz /tmp/{*.txt,*.pdf,*.doc}",
shell=True, executable='/bin/bash')
/bin/bash
用于在命令中支持{}
。
该命令不运行/bin/sh
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.