Запуск subprocess.call для запуска приложения командной строки Cocoa - PullRequest
0 голосов
/ 19 июля 2010

У меня есть один фрагмент кода Какао, который я написал и который содержит XML-файл, содержащий ограничивающие прямоугольники, которые затем рисуются поверх видео (каждый блок имеет связанный кадр).Программа Какао предназначена для запуска из командной строки (и принимает все ее параметры в качестве аргументов командной строки)

Я могу нормально запустить программу с любым документом XML.Однако я сталкиваюсь с проблемами, когда пытаюсь запустить программу из скрипта Python.Например:

with file("test.xml") as temp:
    temp.write(doc.toprettyxml())
    # cval is my cocoa program to call, the other arguments are given to the Python script and parsed with optparser
    command = ["./cval", "-o", options.output, "-i", str(options.interval), "-s", "%dx%d" %    (options.width, options.height), "-f", str(options.frames), "-x", temp.name]
    subprocess.call(command)

Иногда это приводит к сбою моего 'cval', а иногда нет (изменение одного числа в документе XML может изменить его поведение).Я также могу убедиться, что он ломается при попытке прочитать элемент XML, которого там нет.Только я могу открыть файл «test.xml» и убедиться, что этот элемент действительно существует.

Однако, если я сам потом запускаю «cval» (вне скрипта Python) с «test.xml»работает нормально.Это заставляет меня поверить, что когда я выполняю subprocess.call, происходит нечто странное, но я не уверен, что это может быть.У меня есть другие миксы Cocoa / Python, которые выполняют совершенно разные задачи (то есть не используют XML), которые также произвольно демонстрируют странное поведение, но имеют более сложный характер.

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

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Поскольку в коде изначально использовались временные файлы, я не смог закрыть файл, прежде чем передать его в подпроцесс.Однако вместо этого я должен очистить файл перед вызовом subprocess.call.Несоответствующее поведение, вероятно, вызвано размером ввода, вызывающим автоматическую очистку при различных пороговых значениях.

Код должен выглядеть следующим образом:

with file("test.xml") as temp:
    temp.write(doc.toprettyxml())
    temp.flush()
    command = ["./cval", "-o", options.output, "-i", str(options.interval), "-s", "%dx%d" %    (options.width, options.height), "-f", str(options.frames), "-x", temp.name]
    subprocess.call(command)
0 голосов
/ 20 июля 2010

Возможно, попробуйте добавить туда инструкцию "print command", когда код возврата subprocess.call указывает на ошибку.В случае неудачи посмотрите, есть ли какая-либо разница между тем, что выполняется подпроцессом, и тем, что вы можете запустить из командной строки.Кроме того, попробуйте вызвать subprocess.call(command, shell=True), чтобы ваша команда выполнялась как в оболочке (с форматированием строки и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...