Запуск другой программы из Python - PullRequest
2 голосов
/ 20 сентября 2011

Я хочу вызвать программу несколько раз из кода Python и сохранить вывод этой программы в текстовом файле. Моя первая проблема сейчас - просто вызов другого кода. Я должен перенаправить в другой каталог и вызвать ./rank на output.txt. Вот как я пытаюсь это сделать:

    TheCommand = "~/src/rank-8-9-2011/rank output.txt"
    os.system(TheCommand)

но я получаю ошибку синтаксического анализа.

 [Parsing error on line ]Unknown error: 0

Я использую python2.7 в Mac OS 10.5.8. Я не уверен, в чем проблема. Я также пытался использовать подпроцесс:

 subprocess.call(["~/src/rank-8-9-2011/rank", "output.txt"])

Это не находит каталог (у меня такое ощущение, что я использую подпроцесс неправильно), но я не знаю, что не так с os.system.

Ответы [ 3 ]

5 голосов
/ 20 сентября 2011

имя программы в первом аргументе subprocess.Popen не должно содержать ~, поскольку оно не передает строку в оболочку для обработки (что, как всегда при использовании параметризованных запросов в sql, защищает один от внедрения строкиатаки, например, если вместо output.text у одного было ;rm -rf /, системная версия будет запускать rank, а затем - rm -rf ., но subprocess.Popen будет только rank открывать файл с именем ;rm -rf .), поэтомунужно расширить его, вызвав os.path.expanduser:

subprocess.Popen([os.path.expanduser('~/src/rank-8-9-2011/rank'), "output.txt"])

, хотя можно включить обработку оболочки, передав shell=True, по вышеуказанной причине это не рекомендуется.

2 голосов
/ 20 сентября 2011

вы должны попробовать http://docs.python.org/library/os.path.html#os.path.expanduser

import os.path
subprocess.call([os.path.expanduser("~/src/rank-8-9-2011/rank"), "output.txt"])
0 голосов
/ 20 сентября 2011

Я вполне уверен, что ваша ошибка синтаксического анализа исходит от rank, а не от вашей команды os.system, так как ничего там не выглядит странно. Что произойдет, если вы запустите rank вручную?

subprocess, похоже, проблема с '~', хотя я не сразу понимаю, почему. Укажите полный путь, и он должен работать (хотя вы, вероятно, получите эту ошибку синтаксического анализа, если это действительно проблема с rank).

...