Это сбивает меня с толку.
У меня есть скрипт на python, который выполняет некоторую работу на платформе Windows для генерации XML-файла, загрузки некоторых изображений и затем вызывает внешнее консольное приложение для генерации видео с использованием xmlи изображения, сгенерированные скриптом python.
Приложение, которое я вызываю с помощью pOPen, должно возвращать статус, т. е. [success] или [invalid] или [fail] в зависимости от того, как оно интерпретирует данные, которые я передаю.
Если я использую свой сценарий генерации для генерации информации, а затем вызываю консольное приложение отдельно в другом сценарии, он работает нормально, и я получаю успех, и создается видео.
Успешный код (пожалуйста, игнорируйтетестовые распечатки!):
print ("running console app...")
cmd = '"C:/Program Files/PropertyVideos/propertyvideos.console.exe" -xml data/feed2820712.xml -mpeg -q normal'
print (cmd)
p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = p.communicate()[0]
print ("\n----\n[" + output + "]\n----\n")
if output == "[success]":
print "\nHURRAHHHHH!!!!!!!"
print ("finished...")
Но если я добавлю тот же код в конец скрипта, который генерирует информацию для подачи в консольное приложение, то он будет работать около 2 секунд и вывести = []
Тот же код, только что запущенный в конце другого скрипта ...
РЕДАКТИРОВАТЬ: Благодаря Дейву, Дгранту и ThomasKПолучается, что сценарий генерации не закрывает файл, поскольку перенаправление strerr на стандартный вывод показывает:
Unhandled Exception: System.IO.IOException: The process cannot access the file '
C:\videos\data\feed2820712.xml' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, I
nt32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions o
ptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
Однако я ЕСМЬ закрываю файл: Извлечение из сценария генерации:
xmlfileObj.write('</FeedSettings>\n') # write the last line
xmlfileObj.close
# sleep to allow files to close
time.sleep(10)
# NOW GENERATE THE VIDEO
print ("initialising video...")
cmd = '"C:/Program Files/PropertyVideos/propertyvideos.console.exe" -xml data/feed2820712.xml -mpeg -q normal'
print (cmd)
p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = p.communicate()[0]
print ("\n----\n[" + output + "]\n----\n")
if output == "[success]":
print "\nHURRAHHHHH!!!!!!!"
print ("finished...")
Любая помощь будет оценена.