открыть с питоном - PullRequest
       4

открыть с питоном

0 голосов
/ 23 ноября 2011

Это сбивает меня с толку.

У меня есть скрипт на 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...")   

Любая помощь будет оценена.

1 Ответ

4 голосов
/ 23 ноября 2011

Вы не закрываете файл. Ваш код говорит:

xmlfileObj.close

когда это должно быть

xmlfileObj.close()

Редактировать: Просто для пояснения - код xmlfileObj.close является допустимым выражением Python, которое возвращает ссылку на встроенный метод close объекта файла (или подобного файла). Так как это допустимое выражение Python, это совершенно допустимый код, но он не имеет побочных эффектов. В частности, он не вызывает фактического вызова метода close(). Для этого вам нужно включить открывающие и закрывающие скобки.

...