Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python脚本内的子流程中使用*?_Python_Bash_Python 2.7 - Fatal编程技术网

如何在python脚本内的子流程中使用*?

如何在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.

在我用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.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访问权限”的方式多。