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

时间:2016-02-23 14:28:25

标签: python bash python-2.7

我正在尝试删除我在Python 2.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是要删除的文件夹之一),代码工作正常并删除所需的文件夹。

如何一次删除所有文件夹?如果我使用*表示我要删除所有文件夹,为什么它不起作用?

2 个答案:

答案 0 :(得分:4)

您不能使用*因为subprocess不在shell中运行(例如Bash),而是将*扩展为文件列表的shell。< / p>

可以使用shell=True告诉subprocess在shell中运行,但是isn't a great idea,还有更好的选择。

如果您需要recursively delete a directory,可以使用shutil.rmtree()并避免启动子流程。

答案 1 :(得分:0)

您可以让subprocess运行shell来解释您的命令。命令行需要作为字符串传递,而不是列表:

subprocess.Popen('rm -r *', shell=True, ...)