python3.x - java memanggil python, kod python berhenti secara automatik, dan sebabnya tidak dapat ditemui
習慣沉默
習慣沉默 2017-06-28 09:23:50
0
3
1021
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

習慣沉默
習慣沉默

membalas semua(3)
Peter_Zhu

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.

巴扎黑

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

漂亮男人

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

? 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan