2017-08-30 291 views
0

javaからpythonクラスメソッドを呼び出して実行するにはどうすればよいですか?私が実行したいと思いますJava - processbuilderを使用してpythonクラスを呼び出す方法

if __name__ == '__main__': 
    print("hello") 

しかし、私は関係なく、if __name__ == '__main__':

例Pythonのクラスメソッドの、クラスのメソッドを実行したい:

私の現在のJavaコードは動作しますが、私が書く場合にのみ、
class SECFileScraper: 
    def __init__(self): 
     self.counter = 5 

    def tester_func(self): 
     return "hello, this test works" 

私は基本的にSECFileScraper.tester_func()をjavaで実行したいと考えています。

私のJavaコード:

try { 

      ProcessBuilder pb = new ProcessBuilder(Arrays.asList(
        "python", pdfFileScraper)); 
      Process p = pb.start(); 

      BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line = ""; 
      System.out.println("Running Python starts: " + line); 
      int exitCode = p.waitFor(); 
      System.out.println("Exit Code : " + exitCode); 
      line = bfr.readLine(); 
      System.out.println("First Line: " + line); 
      while ((line = bfr.readLine()) != null) { 
       System.out.println("Python Output: " + line); 


      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

pdfFileScraperは私のPythonスクリプトへのファイルパスです。

私はjythonを試しましたが、私のpythonファイルはpandasとsqlite3を使用していますが、これはjythonを使って実装することはできません。

答えて

1

あなたの要件を理解していれば、pdfFileScraper.pyのクラスメソッドを呼び出す必要があります。私たちがやることはpdfFileScraperのディレクトリを取得し、PYTHONPATHに追加し、その後、我々はpdfFileScraperファイルをインポートコマンドでのpythonを実行している

scraper=path/to/pdfFileScraper.py 
dir_of_scraper=$(dirname $scraper) 
export PYTHONPATH=$dir_of_scraper 
python -c 'import pdfFileScraper; pdfFileScraper.ClassInScraper()' 

:シェルからこれを行うための基本はと同類なものになるだろうモジュールとしてクラス内のすべてのメソッドとクラスをネームスペースpdfFileScraperに公開し、クラスClassInScraper()を作成します。 Javaで

、のようなもの:あなたはまた、JNI経由で直接Pythonのlibが呼び出すことができます

import java.io.*; 
import java.util.*; 

public class RunFile { 
    public static void main(String args[]) throws Exception { 
     File f = new File(args[0]); // .py file (e.g. bob/script.py) 

     String dir = f.getParent(); // dir of .py file 
     String file = f.getName(); // name of .py file (script.py) 
     String module = file.substring(0, file.lastIndexOf('.')); 
     String command = "import " + module + "; " + module + "." + args[1]; 
     List<String> items = Arrays.asList("python", "-c", command); 
     ProcessBuilder pb = new ProcessBuilder(items); 
     Map<String, String> env = pb.environment(); 
     env.put("PYTHONPATH", dir); 
     pb.redirectErrorStream(); 
     Process p = pb.start(); 

     BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = ""; 
     System.out.println("Running Python starts: " + line); 
     int exitCode = p.waitFor(); 
     System.out.println("Exit Code : " + exitCode); 
     line = bfr.readLine(); 
     System.out.println("First Line: " + line); 
     while ((line = bfr.readLine()) != null) { 
      System.out.println("Python Output: " + line); 
     } 
    } 
} 
+0

をそれは何も出力しない:この方法では、新しいプロセスを起動していない、あなたはサンプルのため、ここで見てみましょうなど

スクリプトの呼び出しの間でコンテキストを共有することができます。 '実行中のPythonが始まる: 終了コード:0 ファーストライン:null' – Theo

+2

ProcessBuilderは* printed *の出力を扱うことしかできないので、文字列を返す行は実際には解析できるものを表示しません。 'print 'する必要があります。このテストは、' '望む結果を得るために働きます。 Pythonオブジェクトと直接対話したい場合は、mkoのようなソリューションを使用する必要があります。つまり、VMでPythonインタプリタをロードし、直接インタラクトします。 – Petesh

関連する問題