如何在不使用shell=True的情况下执行此Python子进程调用?

如何在不使用shell=True的情况下执行此Python子进程调用?,python,bash,subprocess,Python,Bash,Subprocess,例如,在/tmp中,我有以.txt、.doc和.jpg结尾的文件,我希望使用shred和SUBSPROCESS一步删除这些文件 以下内容将完成此工作: 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/{*

例如,在/tmp中,我有以.txt、.doc和.jpg结尾的文件,我希望使用shred和SUBSPROCESS一步删除这些文件

以下内容将完成此工作:

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}'])
有什么建议吗

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
...
$ 
您可以通过以下方式了解命令是如何展开和拆分的:

$ 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
...
$ 

我相信另一个人是正确的(虽然我自己没有试过)。然而,如果你发现自己再次遇到类似的问题,可能会有所帮助。它接受字符串“s”,并“使用类似shell的语法”将其拆分


我相信另一个人是正确的(虽然我自己没有试过)。然而,如果你发现自己再次遇到类似的问题,可能会有所帮助。它接受字符串“s”,并“使用类似shell的语法”将其拆分


如果该命令来自可靠来源,例如,它是硬编码的,则使用
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

如果该命令来自可信来源,例如,它是硬编码的,则使用
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

哇,这是一些好东西。谢谢你通知我,不客气。python标准库相当大,有很多有用的东西需要发现。如果您喜欢比Doug Hellman建议的python文档更易于理解的形式。@PythonNoob:注意:
子流程
模块的PyMOTW描述中的第一个命令不正确:它使用了
shell=True
和一个列表参数:不要这样做,它几乎总是错误的。在那里读我的评论。否则PyMOTW是一个很好的资源。哇,这是一些很好的东西。谢谢你通知我,不客气。python标准库相当大,有很多有用的东西需要发现。如果您喜欢比Doug Hellman建议的python文档更易于理解的形式。@PythonNoob:注意:
子流程
模块的PyMOTW描述中的第一个命令不正确:它使用了
shell=True
和一个列表参数:不要这样做,它几乎总是错误的。在那里读我的评论。否则PyMOTW是一个很好的资源。