Python子进程:在开始下一个命令之前等待命令完成?

Ric*_*ard 7 python subprocess imagemagick imagemagick-convert

我编写了一个Python脚本,使用wget下载并转换许多图像,然后通过链接subprocess调用使用ImageMagick :

for img in images: 
  convert_str = 'wget -O  ./img/merchant/download.jpg %s; ' % img['url'] 
  convert_str += 'convert ./img/merchant/download.jpg -resize 110x110 ' 
  convert_str += ' -background white -gravity center -extent 110x110' 
  convert_str += ' ./img/thumbnails/%s.jpg' % img['id']
  subprocess.call(convert_str, shell=True)
Run Code Online (Sandbox Code Playgroud)

如果我convert_str在命令行手动运行内容,它似乎没有任何错误,但如果我运行脚本使其重复执行,它有时会给我以下输出:

--2013-06-19 04:01:50--  
http://www.lkbennett.com/medias/sys_master/8815507341342.jpg
Resolving www.lkbennett.com... 157.125.69.163
Connecting to www.lkbennett.com|157.125.69.163|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22306 (22K) [image/jpeg]
Saving to: `/home/me/webapps/images/m/img/merchant/download.jpg'

 0K .......... .......... .                               100% 1.03M=0.02s

2013-06-19 04:01:50 (1.03 MB/s) - 
`/home/annaps/webapps/images/m/img/merchant/download.jpg' saved [22306/22306]

/home/annaps/webapps/images/m/img/merchant/download.jpg 
[Errno 2] No such file or directory: 
' /home/annaps/webapps/images/m/img/merchant/download.jpg'
Run Code Online (Sandbox Code Playgroud)

奇怪的是,尽管有No such file or directory消息,图像通常似乎已下载并转换为OK.但偶尔他们看起来很腐败,上面有黑色条纹(即使我使用的是最新版本的ImageMagick),我认为这是因为在命令执行之前它们没有完全下载.

有什么方法我可以对Python说subprocess:"在第一个命令完全成功完成之前,不要运行第二个命令吗?".我发现这个问题却看不清楚答案!

Syl*_*oux 12

通常情况下,subprocess.call被阻止.

如果您想要非阻塞行为,您将使用subprocess.Popen.在这种情况下,您必须明确使用Popen.wait等待进程终止.

请参阅/sf/answers/198612361/


顺便说一句,在shell中,如果您希望链接进程,则应使用&&而不是;- 因此,如果第一个命令失败,则阻止启动第二个命令.此外,您应该在Python程序中测试子进程退出状态,以确定命令是否成功.