2

私は現在、Pythonコードをテキスト編集、保存、実行できるJavaプロジェクトに取り組んでいます。しかし、私はこのコードの実行で問題にぶつかりました。

コードを実行するために、私は次のことを行ってきました。

Process p = Runtime.getRuntime().exec("python someFileName.py",null,new File("someFilePath");

ここから、このプロセスを取得し、プロセスから入力ストリームと出力ストリームを取得しようとするクラスがあります。.01秒ごとに更新されるアクションリスナーが設定されたタイマーがあります。

しかし、それは問題ではありません。プログラムがPythonのprintステートメントのみで構成されている場合は、問題なく入力を受け取ることができます。

プログラムにraw_inputまたはtime.sleepのいずれかをブロックする必要があるものが含まれている場合、何も表示されません。

私のactionPerformedメソッドは次のとおりです。

public void actionPerformed(ActionEvent e)
{
    try
    {
        while(inStream.available() > 0)
        {
            System.out.print((char)inStream.read());
        }
        while(errStream.available() > 0)
        {
            System.out.print((char)errStream.read());
        }
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
}

出力を処理するために、JTextAreaにKeyListenerがあり、その領域のコンテンツを出力ストリームに送信します。

Pythonプログラムにブロックが必要なものがあると、プログラム内のどの場所に関係なく、すべてがロックされます。

たとえば、私はこのPythonプログラムを持っています:

import time

print "Welcome to my Program!"
print "Performing calculations"
time.sleep(5)
num = 5
print "Adding 5 to your number"
for x in range(5):
    num+=1
    print num
print "Finished!"

スリープしている間は何も表示されません。私がJavaプログラムで受け取るものは次のようになると思います。

私のプログラムへようこそ!計算を実行しています...その後5秒間何もしません...次に、数値に5を加算します6 7 8 9 10終了しました!

ただし、5秒が経過するまで何も表示されません。プログラムを実行し、5秒間待つと、大量のテキストが表示されます。

または、raw_inputを使用する場合も、同じことが起こります。つまり、これを使用してユーザーに入力を求めることはできません。

タイマーや入力ですべてが邪魔になるのを待つのではなく、テキストが徐々に表示されるように、このブロッキングの問題について何らかの助けが得られることを望んでいました。

ヘルプやリソースをいただければ幸いです。私の現在のOSはMacですが、Windowsでも(可能であれば)どのソリューションでも機能するようにしたいと考えています。

4

1 に答える 1

3

デフォルトでは、Pythonスクリプトはバッファリングされた出力で実行されます。つまり、スクリプトが終了してフラッシュするまで、stdoutが表示されない場合があります。あなたがしなければならないのは、バッファリングされていない出力を要求するために-uでpythonを起動することです。次に、あなたはあなたが期待していたものを見るでしょう。

python -u someFileName.py
于 2012-08-22T00:50:49.810 に答える