Rumah  >  Soal Jawab  >  teks badan

python3.x - java memanggil python, kod python berhenti secara automatik, dan sebabnya tidak dapat ditemui

String[] args = {"python3", pythonFile};
Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor();
BufferedInputStream in = new BufferedInputStream(process.getInputStream());
BufferedInputStream err = new BufferedInputStream(process.getErrorStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
BufferedReader errBr = new BufferedReader(new InputStreamReader(err));
String lineStr;
while ((lineStr = inBr.readLine()) != null) {
    logger.info(lineStr);
}
while ((lineStr = errBr.readLine()) != null) {
    logger.error(lineStr);
}        
inBr.close();
errBr.close();
in.close();
err.close();

Panggil kod python, masa pelaksanaan agak lama, dianggarkan beberapa jam, kira-kira lima atau enam jam. Jika anda melaksanakan perintah Python secara langsung dalam shell sahaja, tidak akan ada masalah, namun, jika anda menggunakan java untuk memanggil python dengan cara ini, akan ada masalah: selepas tempoh masa, python tidak akan mempunyai output. Cara saya untuk menentukan sama ada python sedang berjalan adalah dengan terus menulis fail, dan sekali-sekala, tulis fail ke sistem fail. Jika anda memasukkan arahan python terus ke dalam shell, ia adalah perkara biasa. Java memanggil python Selepas lebih daripada tiga jam, tiada fail dijana, tetapi menggunakan htop untuk menyemak, benang itu masih ada. Persekitaran berjalan adalah ubuntu

習慣沉默習慣沉默2669 hari yang lalu981

membalas semua(3)saya akan balas

  • 天蓬老师

    天蓬老师2017-06-28 09:25:50

    Mengenai interaksi antara java dan python, saya boleh memberi anda idea, hanya untuk rujukan. Saya telah melakukan projek sebelum ini, menggunakan soket, terminal mudah alih ialah skrip java, pelayan adalah python, dan kemudian java menghantar rentetan ke pelayan python untuk interaksi. Anda boleh mencubanya.

    balas
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:25:50

    Anda boleh menyemak jython, yang boleh terus melaksanakan kod python dalam java

    balas
    0
  • 漂亮男人

    漂亮男人2017-06-28 09:25:50

    Ada masalah dengan kod ini:

    Process process = Runtime.getRuntime().exec(args);
    int exitValue = process.waitFor(); // A
    ... process.getInputStream() ...   // B
    

    hendaklah diproses terlebih dahulu BgetInputStream() dan kemudian getInputStream()再处理AwaitForA

    waitFor, kerana Java berkomunikasi dengan program yang dipanggilnya melalui paip Jika tidak Dengan membaca paip dalam masa, program yang dipanggil mungkin menyekat semasa menulis ke stdout.

    Jadi susunan yang betul ialah:

    Process process = Runtime.getRuntime().exec(args);
    ... process.getInputStream() ...   // B
    ... process.getErrorStream() ...   // C
    int exitValue = process.waitFor(); // A
    

    Tinggalkan soalan lain:

    inputStream还是先读errorStreamJika atur cara yang dipanggil menulis ke stderr dahulu dan kemudian ke stdout, adakah ia masih akan menyekat? Patutkah anda membaca Java dahulu

    ? 🎜

    balas
    0
  • Batalbalas