Выполняется ли код 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")) 

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

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

  • Неблокирование чтения из нескольких подпроцессов (Python)
  • Python, Popen и select - ожидание завершения процесса или тайм-аута
  • Получение результата в реальном времени из ffmpeg для использования в индикаторе выполнения (PyQt4, stdout)
  • Невозможно получить доступ к jarfile с помощью подпроцесса
  • Кудрявые скобки в python Popen
  • Тайм-аут подпроцесса Python?
  • Оператор Python 'return not' в подпроцессе returncode
  • Запуск интерактивной команды изнутри python
  • python подпроцесс Popen environment PATH?
  • Python читает файл как поток из HDFS
  • Подпроцесс Python работает в фоновом режиме перед возвратом вывода
  • Python - лучший язык программирования в мире.