python等待shell命令完成

时间:2013-04-24 15:56:18

标签: python shell subprocess wait

我正在运行脚本来取消一些文件,然后删除rar文件。 我是通过shell运行命令来做到这一点的。我已经尝试了几种不同的方法让脚本等到完成解压缩文件,但它仍然继续并在文件被使用之前删除它。

我试过下面的代码,这是不行的。我试图看看我是否可以让wait()工作,但也没有运气。

有什么想法吗? 运行python 2.7

编辑:我希望脚本运行命令:)

            p = subprocess.Popen('unrar e ' + root + '/' + i + ' ' + testfolder,
                                 bufsize=2048, shell=True,
                                 stdin=subprocess.PIPE)
            p.stdin.write('e')
            p.communicate()

for root, dirs, files in os.walk(testfolder):
    for i in files:

        print 'Deleting rar files'
        os.remove(i)

for i in os.listdir(testfolder):
    if os.path.isdir(testfolder + i):
        shutil.rmtree(testfolder + i)

2 个答案:

答案 0 :(得分:6)

这是邪恶的:

p = subprocess.Popen('unrar e ' + root + '/' + i + ' ' + testfolder,
        bufsize=2048, shell=True, stdin=subprocess.PIPE)

相反,

p = subprocess.Popen(['unrar', 'e', '%s/%s' % (root, i), testfolder],
        bufsize=2048, stdin=subprocess.PIPE)
p.stdin.write('e')
p.wait()
if p.returncode == 0:
    pass # put code that must only run if successful here.

通过将精确数组而不是字符串传递给Popen而不使用shell=True,其中包含空格的文件名不能解释为多个参数或子shell命令,或其他一些潜在的恶意内容(想想名称中包含$(rm -rf ..)的文件)。

然后,在调用p.wait()之后(当你没有捕获stderr或stdout时不需要p.communicate()),你必须检查p.returncode以确定该过程是否成功,以及只有在p.returncode == 0(表示成功)时才会继续删除文件。

p.communicate()进程仍然在运行时unrar正在返回的初步诊断不可行; p.communicate()p.wait()不会那样工作。


如果在ssh之间运行,则会稍微改变一下:

import pipes # in Python 2.x; in 3.x, use shlex.quote() instead
p = subprocess.Popen(['ssh', ' '.join(
      [pipes.quote(s) for s in ['unrar', 'e', '%s/%s' % (root, i), testfolder]])

答案 1 :(得分:1)

您的问题是在等待子进程,还是按顺序执行(意味着解压缩,然后删除)。

如果您的问题在子进程上等待,那么您应该检查函数subprocess.call

检查:

http://docs.python.org/2/library/subprocess.html#module-subprocess

该功能会阻塞,直到另一个进程终止。

如果您的问题是解压缩文件,并且您不必使用subprocessess,那么只需检查任何其他lib解压缩,例如pyunrar2:

或另一个: