如何在python脚本内的子流程中使用*?
在我用Python2.7编写的一些代码中,我试图删除大量文件夹,要删除的文件夹与我正在运行的代码位于同一个文件夹中。为此,我以以下方式使用子流程:如何在python脚本内的子流程中使用*?,python,bash,python-2.7,Python,Bash,Python 2.7,在我用Python2.7编写的一些代码中,我试图删除大量文件夹,要删除的文件夹与我正在运行的代码位于同一个文件夹中。为此,我以以下方式使用子流程: import subprocess def runsafe(job,args): jobs=[job]; for arg in args: jobs.append(arg) proc=subprocess.Popen(jobs,stdout=subprocess.PIPE) return proc.
import subprocess
def runsafe(job,args):
jobs=[job];
for arg in args:
jobs.append(arg)
proc=subprocess.Popen(jobs,stdout=subprocess.PIPE)
return proc.stdout.readlines()
if __name__=="__main__":
runsafe("rm",["-r","./*/"])
如果我这样做,代码不会删除任何文件夹。显然,如果我在终端中写入rm-r./*/
,运行代码的文件夹中的所有文件夹都将被删除。另外,如果我在我的runsafe(“rm”,“[”-r”,““/*/”])
代码中更改runsafe(“rm”,“[”-r“,“/foo/”])
(其中foo是要删除的文件夹之一),代码工作正常并删除所需的文件夹
如何一次删除所有文件夹?如果我用*表示要删除所有文件夹,为什么不起作用 您可以让
子流程
运行shell来解释您的命令。命令行需要作为字符串而不是列表传递:
subprocess.Popen('rm -r *', shell=True, ...)
您不能使用
*
,因为子流程
不是在shell(例如Bash)中运行的,而是shell将*
扩展到文件列表中
您可以使用shell=True
告诉subprocess
在shell中运行,但这是一个错误,而且还有更好的替代方法
如果需要,您可以使用并避免启动子流程。但不鼓励使用
shell=True
,因为这会带来安全风险。特别是当与rm-r
命令搭配使用时,我会犹豫是否这样做。只要命令字符串是以编程方式创建的,我就不会看到太多问题。用户(或其他)输入将是一个真正的问题,即使经过清理。即使它是“以编程方式创建”的,它也更容易出错,因为shell必须解析字符串,这意味着空格和其他特殊字符可能会导致问题。shell=True
在概念上类似于手动构造SQL查询(与使用准备好的报表相反)。当然,您可以安全地执行此操作,但为什么要冒险呢?这比任何任意错误都要危险得多;它可能会让用户shell访问您的系统。我非常喜欢SQL类比,我完全理解您的观点。然而,我的观点是,只要用户输入没有接近子进程调用,您可能仍然会指向一组错误通过shell=True
在您自己的脚上玩枪,但它给用户shell访问权限的方式并不比直接调用rm
给用户“rm访问权限”的方式多。