调用使用通配符子RM不删除文件(Calling rm from subprocess using w

2019-06-25 11:16发布

我试图建立一个功能,将删除所有与我的项目的根“前加上”开头的文件。 这里是我到目前为止

def cleanup(prepend):
    prepend = str(prepend)
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    end = "%s*" % prepend
    cmd = 'rm'
    args = "%s/%s" % (PROJECT_ROOT, end)
    print "full cmd = %s %s" %(cmd, args)
    try:
        p = Popen([cmd, args],  stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True).communicate()[0]
        print "p", p
    except Exception as e:
        print str(e)

我没有任何运气 - 它似乎并没有被做任何事情。 你有什么想法我可能是做错了? 谢谢!

Answer 1:

问题是,你传递两个参数到subprocess.Popenrm和路径,如/home/user/t* (如果前缀是t )。 Popen然后会尝试删除一个名为正是这样的文件:T,随后在年底的星号。

如果你想使用Popen用通配符,你应该通过shell参数为True 。 在这种情况下,然而,命令应该是一个字符串,而不是参数列表:

Popen("%s %s" % (cmd, args), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)

(否则, 参数列表,将给予新的外壳,而不是命令 )

另一种解决方案,更安全和更有效的是使用的glob模块 :

import glob
files = glob.glob(prepend+"*")
args = [cmd] + files
Popen(args,  stdin=PIPE, stdout=PIPE, stderr=PIPE)

所有的一切,但是,我认为,捷尔解决方案是理智的一个。 在这种情况下, glob是答案太:

files = glob.glob(prepend+"*")
for file in files:
    os.remove(file)


Answer 2:

你会考虑使用这种方法os.remove()来删除文件,而不是rm

import os
os.remove('Path/To/filename.ext')

更新 (基本上是从下面移动我的评论到我的答案):

作为os.remove()不能处理自身的通配符,使用水珠模块,以帮助将产生自本逐字重复的解决方案SO回答 :

import glob
import os
for fl in glob.glob("E:\\test\\*.txt"):
    #Do what you want with the file
    os.remove(fl)


Answer 3:

我会尝试这样的事情(这也适用于Windows,但我猜这是不是对你的关注:

def cleanup(prepend):
    prepend = str(prepend)
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    for file_to_delete in [file for file in os.listdir(PROJECT_ROOT) if file.startswith(prepend)]:
        os.remove(file_to_delete)


文章来源: Calling rm from subprocess using wildcards does not remove the files