Den*_*sen 4 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)
Run Code Online (Sandbox Code Playgroud)
这是邪恶的:
p = subprocess.Popen('unrar e ' + root + '/' + i + ' ' + testfolder,
bufsize=2048, shell=True, stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
代替,
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.
Run Code Online (Sandbox Code Playgroud)
通过传递一个确切的数组而不是一个字符串Popen而不使用它shell=True,一个带有空格的文件名不能被解释为多个参数,子shell命令或其他一些潜在的恶意内容(想想一个带有文件的文件)$(rm -rf ..)在它的名字).
然后,在调用之后p.wait()(不需要p.communicate()捕获stderr或stdout时),必须检查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]])
Run Code Online (Sandbox Code Playgroud)
您的问题是等待子进程,还是按顺序执行操作(意味着解压,然后删除)。
如果您的问题是等待子进程,那么您应该检查该函数subprocess.call
查看:
http://docs.python.org/2/library/subprocess.html#module-subprocess
该函数会阻塞,直到另一个进程终止。
但是,如果您的问题是解包文件,并且您不必使用子进程,那么只需检查任何其他用于解包的库,例如 pyunrar2:
或另一个: