0

シェルコマンド「fst-mor」があります。これは、ファイルの形式で引数を取ります。たとえば、lexファイルなどであるNOUN.Aです。最終コマンド:fst-mor NOUN.A

次に、次の出力を生成します。

analyze>INPUT_A_STRING_HERE
OUTPUT_HERE

ここで、Pythonスクリプトからそのfst-morを呼び出してから文字列を入力し、スクリプトに出力を戻したいと思います。

これまでのところ:

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

4 に答える 4

3

別のコマンドの出力をキャプチャしたいとします。subprocessこのためのモジュールを使用してください。

import subprocess

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

コマンドにインタラクティブな入力が必要な場合は、次の2つのオプションがあります。

  • subprocess.Popen()オブジェクトを使用し、stdinパラメータをに設定してsubprocess.PIPE、使用可能なstdinパイプに入力を書き込みます。多くの場合、1つの入力パラメーターで十分です。subprocess詳細については、モジュールのドキュメントを調べてください。ただし、基本的な相互作用は次のとおりです。

    proc = subprocess.Popen(['fst-mor', 'NOUN.A'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    output, err = proc.communicate('INPUT_A_STRING_HERE')
    
  • pexpectライブラリを使用してプロセスを推進します。これにより、サブプロセスが生成する出力であるパターンを探すことにより、サブプロセスとのより複雑な相互作用を作成できます。

    import pexpect
    
    py = pexpect.spawn('fst-mor NOUN.A')
    py.expect('analyze>')
    py.send('INPUT_A_STRING_HERE')
    output = py.read()
    py.close()
    
于 2013-02-23T15:22:53.593 に答える
1

あなたは試すことができます:

from subprocess import Popen, PIPE

p = Popen(["fst-mor", "NOUN.A"], stdin=PIPE, stdout=PIPE)
output = p.communicate("INPUT_A_STRING_HERE")[0]
于 2013-02-23T15:49:22.340 に答える
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:])

通信は実行後にストリームを閉じるため、このメソッドが機能するには、事前にすべてのコマンドを知っておく必要があることに注意してください。stdinが閉じられるまでpipe.stdoutがフラッシュされないようです。私が行方不明になっていることを回避する方法があるかどうか知りたいです。

于 2013-02-23T15:54:05.723 に答える
-1

サブプロセスモジュールを使用する必要がありますサブプロセスモジュール

あなたの例では、次のように実行できます。

subprocess.check_output(["fst-mor", "NOUN.A"])
于 2013-02-23T15:25:03.613 に答える