4

会社の内部ツールキットのフロントエンドを構築しています。ツールの半分はPythonで書かれ、残りの半分は他のいくつかのスクリプト言語で書かれています。だから私はswingを使ってJavaでフロントエンドを構築しています。これまでのところ、次のコードを使用してPythonスクリプトを呼び出すことができます。

public class Foo
{
    public static void main(String[] args)
    {
        try
        {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec("python foo.py");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            p.waitFor();
            String line = "";
            while (br.ready())
                System.out.println(br.readLine());

        }
        catch (Exception e)
        {
        String cause = e.getMessage();
        if (cause.equals("python: not found"))
            System.out.println("No python interpreter found.");
        }
    }
} 

これは見事に機能しますが、Pythonスクリプトでエラーが発生した場合、エラーは出力されません。エラーが発生した場合も出力されるようにするにはどうすればよいですか?

4

2 に答える 2

5

簡単な答えは、 も読むことProcess.getErrorStreamです。

より複雑な答えは、あなたが Python と呼んでいるものは、言語の実装の 1 つにすぎない CPython を指している可能性が高いということです。別の実装である Jython があります。これは、基本的に Python を Java バイトコードにコンパイルして、JVM で実行します。これにより、単純に Java 経由で CPython を呼び出すよりも緊密な統合が可能になります。Runtime.exec

PSRuntime.execは、物事を行う古い方法のようなものです。ProcessBuilder多くの場合、Java でサブプロセスを開始するためのよりクリーンで直感的な方法です。

于 2013-03-20T04:26:53.840 に答える
0

前の答えはOKです。次のようなプロセスのリソースを解放することをお勧めします。

        Process process = null;
    try{
        //xxxx
    }catch(xxx){

    }finally{
        if(process!=null){
            process.destroy();
        }
    }

その理由は、プロセスを破棄するのを忘れた場合、関連するファイル ハンドラーがリークし、最終的に IOException show too many open files が発生するためです。

于 2013-03-20T04:37:07.710 に答える