【问题标题】:Python subprocess: wait for command to finish before starting next one?Python子进程:等待命令完成后再开始下一个?
【发布时间】:2013-06-15 21:59:26
【问题描述】:

我编写了一个 Python 脚本,它使用 wget 和 ImageMagick 通过 chainedsubprocess 调用下载和转换许多图像:

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)

如果我在命令行手动运行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'

奇怪的是,尽管有No such file or directory 消息,但图像通常似乎已下载并转换正常。但有时它们看起来很损坏,上面有black stripes(即使我使用的是最新版本的 ImageMagick),我认为这是因为在命令执行之前它们没有完全下载。

我有什么办法可以对 Python 或 subprocess 说:“在第一个命令确定成功完成之前不要运行第二个命令?”。我found this question但看不到明确的答案!

【问题讨论】:

  • 对我来说有趣的是错误行中/home前面的额外空格......(虽然我看不出它来自哪里)

标签: python imagemagick subprocess imagemagick-convert


【解决方案1】:

通常subprocess.call 正在阻塞。

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

https://stackoverflow.com/a/2837319/2363712


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

【讨论】:

  • @mgilson 这不是我说的吗?如果我的英语不够好,请随时编辑。
  • 哦……对不起。你说的好像是这样的。嗯......我今天早上一定要疯了。 (由于某些原因,我第一次阅读它时,我得到的印象是您暗示; 在过程完成之前不一定会阻塞......但是在重新阅读之后,我没有得到第二个印象时间)。
  • 谢谢 - 我不知道&&。根据您的说法,我想我会将wgetconvert 命令分成两个单独的调用,然后在运行convert 之前检查wget 命令的输出。
  • 我不介意命令被阻塞,这不是问题。
  • @mgilson 没问题。我的英语远非完美,有时只能对我自己理解 ;)
【解决方案2】:

Using module 'subprocess' with timeout

不确定这是否是proper 的做法,但我就是这样做的:

import subprocess
from threading import Thread

def call_subprocess(cmd):
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = proc.communicate()
    if err:
        print err

thread = Thread(target=call_subprocess, args=[cmd])
thread.start()
thread.join() # waits for completion.

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2020-04-14
    • 2022-10-04
    • 1970-01-01
    • 2016-08-17
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多