Как ожидать процесса, чтобы закончить использовать IO.popen?

Вот очень простой пример:

import smtplib

server = 'mail.server.com'
user = ''
password = ''

recipients = ['user@mail.com', 'other@mail.com']
sender = 'you@mail.com'
message = 'Hello World'

session = smtplib.SMTP(server)
# if your SMTP server doesn't need authentications,
# you don't need the following line:
session.login(user, password)
session.sendmail(sender, recipients, message)

Для большего количества опций, обработка ошибок, и т.д., смотрит smtplib документация модуля .

19
задан the Tin Man 10 March 2016 в 23:01
поделиться

5 ответов

Я думаю, вам нужно присвоить результаты вызовов IO.popen внутри цикла переменным и продолжать вызывать read () на них, пока eof () не станет истинным для всех.

Тогда вы узнаете, что все программы завершили свое выполнение, и вы можете запустить another_cmd .

5
ответ дан 30 November 2019 в 02:36
поделиться
for foo in bar
  out = IO.popen(cmd_foo)
  out.readlines
end
IO.popen(another_cmd)

Чтение вывода в переменную и вызов out.readlines сделали это. Я думаю, что out.readlines должен дождаться завершения процесса, прежде чем он вернется.

Благодарим Эндрю Y за то, что он указал мне в правильном направлении.

6
ответ дан 30 November 2019 в 02:36
поделиться

. Вам нужен вывод popen ? Если нет, хотите ли вы использовать Kernel # system или другую команду?

1
ответ дан 30 November 2019 в 02:36
поделиться

I suggest you use Thread.join to synchronize the last popen call:

t = Thread.new do
    for foo in bar
       IO.popen(cmd_foo)
    end
end

t.join

IO.popen(another_cmd)
3
ответ дан 30 November 2019 в 02:36
поделиться

Используйте блочную форму и прочтите все содержимое:

IO.popen "cmd" do |io|
  # 1 array
  io.readlines

  # alternative, 1 big String
  io.read

  # or, if you have to do something with the output
  io.each do |line|
    puts line
  end

  # if you just want to ignore the output, I'd do
  io.each {||}
end

Если вы не читаете на выходе процесс может быть заблокирован, потому что канал, соединяющий другой процесс и ваш процесс, заполнен, и никто не читает из него.

19
ответ дан 30 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: