Выполняется ли код python в порядке

Я создаю файл, а затем делаю diff на нем.

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

Это мой код

os.popen("mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables --skip-extended-insert -c %s > %s.sql" % (database, filename)) os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH")) 

3 Solutions collect form web for “Выполняется ли код python в порядке”

os.popen() устарела с версии 2.6 . Однако, чтобы заставить ваш код работать, вы должны дождаться завершения первого процесса (и файла вывода, который должен быть создан), прежде чем запускать второй.

Статус выхода первой команды доступен как возвращаемое значение метода close() возвращаемого объекта файла, поэтому вы можете проверить это до продолжения, то есть:

 pipe = os.popen("mysqldump --login-path=server1_mysql -e --opt " "--skip-lock-tables --skip-extended-insert -c %s > %s.sql" % (database, filename)) if pipe.close() is None: # no errors? os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH")) 

os.popen устарел. Используйте модуль подпроцесса . subprocess.call будет блокировать основной процесс, пока команда не будет завершена. Вы должны проверить код возврата, retval , в случае возникновения ошибки при выполнении команды mysqldump . В этом случае вы не можете продолжить diff :

 import subprocess import shlex with open("{f}.sql".format(f=filename), 'w') as fout: retval = subprocess.call( shlex.split( """mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables --skip-extended-insert -c %s""" % (database, )), stdout=fout) if not retval == 0: raise Exception('Error executing command: {r}'.format(r=retval)) else: with open("{f}.PATCH".format(f=filename), 'w') as fout: retval = subprocess.call( shlex.split("diff {w} {f}".format(w=weekly, f=filename)), stdout=fout) 

Супер простым способом является ожидание занятости:

 os.popen("mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables --skip-extended-insert -c %s > %s.sql" % (database, filename)) while not os.path.isfile(filename): sleep(0.05) # or some other interval os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH")) 

РЕДАКТИРОВАТЬ:

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

  • Почему стандартный вывод из подпроцесса (перенаправлен на небуферизованный файл) буферизуется?
  • Отображать вывод в реальном времени подпроцесса в виджет tkinter
  • Subprocess.call или Subprocess.Popen не могут использовать исполняемые файлы, которые находятся в PATH (Linux / Windows)
  • Запустить IPython-ноутбук с выбранным браузером
  • Python, Popen и select - ожидание завершения процесса или тайм-аута
  • Есть ли способ использовать doctest и sphinx для тестирования и документирования приложений командной строки?
  • Можно ли передать поток io.BytesIO () в subprocess.popen () в Python?
  • цикл над пакетным скриптом, который не заканчивается
  • Python - лучший язык программирования в мире.