2017-12-29 16 views
0

私はPythonスクリプトを実行する必要のあるJavaプログラムを作成しています。
スクリプトは、スクリプトの進行状況を知るためにjavaが読む必要のある出力を表示します。
実行中にスクリプトを一時停止できるようにするには、しばらくの間、入力を要求するようにしてください。これは私のPythonスクリプトである
JavaからPythonスクリプトを実行して入出力を送信する

private static void sevenTry(String[] strCommands) throws IOException { 
    Object oLock1 = new Object(); 
    Object oLock2 = new Object(); 

    ProcessBuilder pBuilder = new ProcessBuilder(strCommands); 
    pBuilder.redirectErrorStream(true); 
    Process proc = pBuilder.start(); 

    Thread tReader = new Thread() { 
     @Override 
     public void run() { 
      System.out.println("~~tReader starting~~"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
      synchronized (oLock1) { 
       try { 
        String line = reader.readLine(); 
        while (line != null && !line.trim().equals("--EOF--")) { 
         System.out.println("Stdout: " + line); 
         if (line.trim().equals("--INPUT--")) { 
          synchronized (oLock2) { 
           oLock2.notify(); 
          } 
          oLock1.wait(); 
         } 
         line = reader.readLine(); 
        } 
       } catch (IOException e) { 
        System.out.println("tReader: " + e.getMessage()); 
       } catch (InterruptedException e) { 
        System.out.println("tReader: " + e.getMessage()); 
       } catch (Exception e) { 
        System.out.println("tReader: " + e.getMessage()); 
       } 
      } 
      System.out.println("~~tReader end~~"); 
      synchronized (oLock2) { 
       oLock2.notify(); 
      } 
     } 
    }; 
    Thread tWriter = new Thread() { 
     @Override 
     public void run() { 
      System.out.println("~~tWriter starting~~"); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 

      String line, input; 
      Scanner scan = new Scanner(System.in); 

      synchronized (oLock2) { 
       try { 
        oLock2.wait(); 
       } catch (InterruptedException e1) { 
        System.out.println("tWriter: " + e1.getMessage()); 
       } 
      } 
      while (tReader.isAlive()) { 
       synchronized (oLock1) { 
        System.out.println("Java: insert input"); 
        scan.hasNext(); 
        input = scan.nextLine(); 
        try { 
         writer.write(input + "\n"); 
         writer.flush(); 
        } catch (IOException e) { 
         System.out.println("tWriter: " + e.getMessage()); 
        } 
        oLock1.notify(); 
       } 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e1) { 
        System.out.println("tWriter: " + e1.getMessage()); 
       } 
      } 
      System.out.println("~~tWriter end~~"); 
     } 
    }; 

    tReader.start(); 
    tWriter.start(); 
    System.out.println("~~everything submitted~~"); 
    try { 
     tReader.join(); 
     tWriter.join(); 
     System.out.println("~~finish~~"); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 


はここに私のJavaメソッドである

# coding=utf-8 
import sys 

print '1' 
print '--INPUT--' 
inum = sys.stdin.readline() 
print '2' 
print '--EOF--' 

私は私のコードを実行してみました

sevenTry("python", "C:\\Testing.py"); 

が、Java側ではそれが立ち往生tリーダーの行内:

String line = reader.readLine(); 

私はまだ(のpython 2.7を使用してIM)同じ問題を持ち出す

inum = raw_input() 

を使ってPythonファイルから

inum = sys.stdin.readline() 

を入力ラインを取る場合、プログラムは動作しません
ここで最も混乱している部分は、これをJavaファイル(Pythonではなく)でテストしようとしたところです。

sevenTry("java", "-classpath", "C:\\class", "CheckCMD"); 

、あなたは気づいているかもしれませんが、それは、入力ラインとさえ

import java.util.Scanner; 

public class CheckCMD { 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     String line; 
     System.out.println("1"); 
     System.out.println("--INPUT--"); 
     in.hasNext(); 
     line = in.nextLine(); 
     System.out.println("2"); 
     System.out.println("--EOF--"); 
    } 
} 

答えて

0

を働いていた、これは、Pythonに関連した問題です。

https://unix.stackexchange.com/questions/182537/write-python-stdout-to-file-immediatelyに記載されているように、

」プロセスSTDOUTは端末以外にリダイレクトされる場合、出力は、いくつかのOS固有のサイズのバッファ(おそらく4K又は多くの場合、8K)にバッファリングされます。 "

したがって、呼び出すたびにsys.stdout.flush()に電話する必要があります。printです。

また、-uパラメータを使用してプロセスのデフォルトの動作を変更して、バッファされていない出力を取得することもできます。

関連する問題