Вот очень простой пример:
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 документация модуля .
Я думаю, вам нужно присвоить результаты вызовов IO.popen
внутри цикла переменным и продолжать вызывать read ()
на них, пока eof ()
не станет истинным для всех.
Тогда вы узнаете, что все программы завершили свое выполнение, и вы можете запустить another_cmd
.
for foo in bar
out = IO.popen(cmd_foo)
out.readlines
end
IO.popen(another_cmd)
Чтение вывода в переменную и вызов out.readlines
сделали это. Я думаю, что out.readlines
должен дождаться завершения процесса, прежде чем он вернется.
Благодарим Эндрю Y за то, что он указал мне в правильном направлении.
. Вам нужен вывод popen
? Если нет, хотите ли вы использовать Kernel # system
или другую команду?
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)
Используйте блочную форму и прочтите все содержимое:
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
Если вы не читаете на выходе процесс может быть заблокирован, потому что канал, соединяющий другой процесс и ваш процесс, заполнен, и никто не читает из него.