2013-02-23 4 views
0

У меня есть командная команда 'fst-mor'. Он принимает аргумент в виде файла, например. NOUN.A, который является файлом lex или чем-то еще. Окончательная команда: fst-mor NOUN.AВызов многоуровневых команд/программ из python

Затем производит следующий вывод:

analyze>INPUT_A_STRING_HERE 
OUTPUT_HERE 

Теперь я хочу поставить называть эту FST-Мором из моего питона сценария, а затем строки ввода и хочу снова выход в сценарии.

До сих пор у меня есть:

import os 
print os.system("fst-mor NOUN.A") 

ответ

3

Вы хотите, чтобы захватить вывод другой команды. Для этого используйте subprocess module.

import subprocess 

output = subprocess.check_output('fst-mor', 'NOUN.A') 

Если команда требует интерактивного ввода, у вас есть два варианта:

  • Используйте subprocess.Popen() объект, и установить параметр stdin для subprocess.PIPE и записи на вход в трубу стандартного ввода доступной. Для одного входного параметра это достаточно часто. Изучите документацию для subprocess модуля для деталей, но основное взаимодействие:

    proc = subprocess.Popen(['fst-mor', 'NOUN.A'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    output, err = proc.communicate('INPUT_A_STRING_HERE') 
    
  • Используйте pexpect library для управления технологическим процессом. Это позволяет вам создавать более сложные взаимодействия с подпроцессом путем поиска моделей является выходным он генерирует:

    import pexpect 
    
    py = pexpect.spawn('fst-mor NOUN.A') 
    py.expect('analyze>') 
    py.send('INPUT_A_STRING_HERE') 
    output = py.read() 
    py.close() 
    
+0

Это снова просят меня ввести INPUT_STRING. Я не хочу вводить данные на терминал. Я хочу, чтобы этот INPUT_STRING был взят из сценария, а также возвратил этот OUTPUT_STRING в скрипт –

+0

@AkshatGoel: немного расширил ответ. Если вы можете дать команде 'fst-mor' больше параметров командной строки, это может быть проще. –

+0

Спасибо, человек! Но отредактированный ответ тоже не помогает. Можете ли вы опубликовать разработанный код, если у вас есть время сейчас или, может быть, чуть позже? Я могу сформулировать проблему в более простых терминах, подобных этому. Вы вызываете типичную программу codechef или spoj из этого скрипта, и вы также хотите ввести эти «тестовые», «входные» переменные программы из сценария и получить результат в скрипте. –

-1

Вы должны использовать модуль subprocess module

подпроцесса В вашем примере вы можете запустить:

subprocess.check_output(["fst-mor", "NOUN.A"]) 
+0

-1 Почему вы публикуете точную копию уже заданного ответа? – jurgenreza

+0

Проблемы параллелизма :) – user2079098

1

Вы можете попробовать:

from subprocess import Popen, PIPE 

p = Popen(["fst-mor", "NOUN.A"], stdin=PIPE, stdout=PIPE) 
output = p.communicate("INPUT_A_STRING_HERE")[0] 
+0

Спасибо человеку! Я поддержал ответ, но, честно говоря, мне придется принять ответ Мартиня! :) Благодаря тонну! :) –

0

Образец, который связывается с другим процессом:

pipe = subprocess.Popen(['clisp'],stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
(response,err) = pipe.communicate("(+ 1 1)\n(* 2 2)") 
#only print the last 6 lines to chop off the REPL intro text. 
#Obviously you can do whatever manipulations you feel are necessary 
#to correctly grab the input here 
print '\n'.join(response.split('\n')[-6:]) 

Обратите внимание, что сообщение, будет закрывать потоки после того, как он работает, так что вы должны знать все ваши команды впереди времени для работы этого метода. Похоже, что pipe.stdout не сбрасывается, пока stdin не закрыт? Мне было бы любопытно, есть ли способ, который мне не хватает.

Смежные вопросы