Jadual Kandungan
Java core
Gunakan ProcessBuilder
Menggunakan Enjin Skrip Java
Rumah Java javaTutorial Bagaimana untuk memanggil Python di Java

Bagaimana untuk memanggil Python di Java

May 17, 2023 pm 12:08 PM
python java

    Bahasa Python mempunyai banyak pengurusan sistem, pemprosesan data dan pakej perisian statistik, jadi keperluan untuk memanggil kod Python daripada aplikasi Java adalah sangat biasa dan praktikal. DataX ialah alat penyegerakan luar talian untuk sumber data heterogen sumber terbuka oleh Alibaba Ia khusus untuk mencapai data yang stabil dan cekap antara pelbagai sumber data heterogen termasuk pangkalan data hubungan (MySQL, Oracle, dll.), HDFS, Hive, ODPS, HBase, FTP. , dsb. Fungsi penyegerakan. Datax juga memanggil skrip Python melalui Java.

    Java core

    Java menyediakan dua kaedah iaitu ProcessBuilder API dan JSR-223 Scripting Engine.

    Gunakan ProcessBuilder

    Buat proses sistem pengendalian tempatan melalui ProcessBuilder untuk memulakan python dan laksanakan skrip Python Skrip hello.py hanya mengeluarkan "Hello Python!". Persekitaran pembangunan perlu dipasang python dan pembolehubah persekitaran ditetapkan.

    @Test
    public void givenPythonScript_whenPythonProcessInvoked_thenSuccess() throws Exception {
        ProcessBuilder processBuilder = new ProcessBuilder("python", resolvePythonScriptPath("hello.py"));
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        List<String> results = readProcessOutput(process.getInputStream());
        assertThat("Results should not be empty", results, is(not(empty())));
        assertThat("Results should contain output of script: ", results, hasItem(containsString("Hello Python!")));
        int exitCode = process.waitFor();
        assertEquals("No errors should be detected", 0, exitCode);
    }
    private List<String> readProcessOutput(InputStream inputStream) throws IOException {
        try (BufferedReader output = new BufferedReader(new InputStreamReader(inputStream))) {
            return output.lines()
                .collect(Collectors.toList());
        }
    }
    private String resolvePythonScriptPath(String filename) {
        File file = new File("src/test/resources/" + filename);
        return file.getAbsolutePath();
    }
    Salin selepas log masuk

    Untuk menulis semula ayat ini anda boleh berkata: Mula menggunakan arahan Python dengan satu hujah, iaitu laluan penuh kepada skrip Python. Ia boleh diletakkan dalam direktori sumber projek java. Apa yang perlu diberi perhatian ialah: redirectErrorStream(true), untuk membuat aliran keluaran ralat digabungkan ke dalam aliran keluaran standard apabila ralat berlaku semasa melaksanakan skrip. Maklumat ralat boleh dibaca dengan memanggil kaedah getInputStream() objek Proses. Tanpa tetapan ini, anda perlu menggunakan dua kaedah untuk mendapatkan strim: getInputStream() dan getErrorStream(). Selepas mendapat objek Proses daripada ProcessBuilder, sahkan keputusan dengan membaca aliran output.

    Menggunakan Enjin Skrip Java

    Spesifikasi JSR-223 mula diperkenalkan dalam Java 6, yang mentakrifkan satu set API skrip yang boleh menyediakan kefungsian skrip asas. API ini menyediakan mekanisme untuk berkongsi nilai dan melaksanakan skrip antara Java dan bahasa skrip. Tujuan utama spesifikasi ini adalah untuk menyatukan interaksi antara Java dan bahasa skrip dinamik yang melaksanakan JVM berbeza Jython ialah pelaksanaan Java Python yang berjalan pada JVM. Dengan mengandaikan kami mempunyai Jython pada CLASSPATH, rangka kerja secara automatik mendapati bahawa kami mempunyai kemungkinan untuk menggunakan enjin skrip tersebut dan membolehkan kami meminta enjin skrip Python secara langsung. Di Maven, kami boleh merujuk Jython, atau memuat turun dan memasangnya terus

    <dependency>
        <groupId>org.python</groupId>
        <artifactId>jython</artifactId>
        <version>2.7.2</version>
    </dependency>
    Salin selepas log masuk

    Anda boleh menyenaraikan semua enjin skrip yang disokong melalui kod berikut:

    public static void listEngines() {
        ScriptEngineManager manager = new ScriptEngineManager();
        List<ScriptEngineFactory> engines = manager.getEngineFactories();
        for (ScriptEngineFactory engine : engines) {
            LOGGER.info("Engine name: {}", engine.getEngineName());
            LOGGER.info("Version: {}", engine.getEngineVersion());
            LOGGER.info("Language: {}", engine.getLanguageName());
            LOGGER.info("Short Names:");
            for (String names : engine.getNames()) {
                LOGGER.info(names);
            }
        }
    }
    Salin selepas log masuk

    Jika Jython tersedia dalam persekitaran, anda harus lihat Output yang sepadan:

    ...
    Nama enjin: jython
    Versi: 2.7.2
    Bahasa: python
    Nama Pendek:
    python
    jython

    Sekarang panggil skrip hello.py menggunakan Jython:

    @Test
    public void givenPythonScriptEngineIsAvailable_whenScriptInvoked_thenOutputDisplayed() throws Exception {
        StringWriter writer = new StringWriter();
        ScriptContext context = new SimpleScriptContext();
        context.setWriter(writer);
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("python");
        engine.eval(new FileReader(resolvePythonScriptPath("hello.py")), context);
        assertEquals("Should contain script output: ", "Hello Python!", writer.toString().trim());
    }
    Salin selepas log masuk

    Menggunakan API ini lebih ringkas daripada contoh di atas. Apabila menetapkan ScriptContext, anda perlu memasukkan StringWriter untuk menyimpan output pelaksanaan skrip. Kemudian berikan nama pendek untuk membenarkan ScriptEngineManager mencari enjin skrip, yang boleh menggunakan python atau jython. Akhir sekali, sahkan bahawa output adalah konsisten dengan jangkaan.

    Malah, anda juga boleh menggunakan kelas PythonInterpretor untuk memanggil terus kod python terbenam:

    @Test
    public void givenPythonInterpreter_whenPrintExecuted_thenOutputDisplayed() {
        try (PythonInterpreter pyInterp = new PythonInterpreter()) {
            StringWriter output = new StringWriter();
            pyInterp.setOut(output);
            pyInterp.exec("print(&#39;Hello Python!&#39;)");
            assertEquals("Should contain script output: ", "Hello Python!", output.toString().trim());
        }
    }
    Salin selepas log masuk

    Kaedah exec yang disediakan oleh kelas PythonInterpreter boleh terus melaksanakan kod Python. Tangkap output pelaksanaan melalui StringWriter seperti dalam contoh sebelumnya. Mari lihat contoh lain:

    @Test
    public void givenPythonInterpreter_whenNumbersAdded_thenOutputDisplayed() {
        try (PythonInterpreter pyInterp = new PythonInterpreter()) {
            pyInterp.exec("x = 10+10");
            PyObject x = pyInterp.get("x");
            assertEquals("x: ", 20, x.asInt());
        }
    }
    Salin selepas log masuk

    Contoh di atas boleh menggunakan kaedah get untuk mengakses nilai pembolehubah. Contoh berikut menunjukkan cara menangkap ralat:

    try (PythonInterpreter pyInterp = new PythonInterpreter()) {
        pyInterp.exec("import syds");
    }
    Salin selepas log masuk

    Menjalankan kod di atas akan membuang pengecualian PyException, yang sama seperti melaksanakan skrip Python secara setempat untuk mengeluarkan ralat.

    Berikut ialah beberapa perkara yang perlu diberi perhatian:

    • PythonIntepreter melaksanakan AutoCloseable, yang paling sesuai digunakan dengan cuba-dengan-sumber.

    • Nama kelas PythonIntepreter bukan penghurai yang mewakili program Python yang dijalankan dalam Jython dalam jvm dan perlu disusun ke dalam kod bait java sebelum pelaksanaan.

    • Walaupun Jython ialah pelaksanaan Python bagi Java, ia mungkin tidak mengandungi semua subpakej yang sama seperti Python asli.

    Contoh berikut menunjukkan cara untuk menetapkan pembolehubah java kepada pembolehubah Python:

    import org.python.util.PythonInterpreter; 
    import org.python.core.*; 
    class test3{
        public static void main(String a[]){
            int number1 = 10;
            int number2 = 32;
            try (PythonInterpreter pyInterp = new PythonInterpreter()) {
                python.set("number1", new PyInteger(number1));
                python.set("number2", new PyInteger(number2));
                python.exec("number3 = number1+number2");
                PyObject number3 = python.get("number3");
                System.out.println("val : "+number3.toString());
            }
        }
    }
    Salin selepas log masuk

    Atas ialah kandungan terperinci Bagaimana untuk memanggil Python di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    Video Face Swap

    Video Face Swap

    Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Topik panas

    Tutorial Java
    1662
    14
    Tutorial PHP
    1261
    29
    Tutorial C#
    1234
    24
    PHP dan Python: Paradigma yang berbeza dijelaskan PHP dan Python: Paradigma yang berbeza dijelaskan Apr 18, 2025 am 12:26 AM

    PHP terutamanya pengaturcaraan prosedur, tetapi juga menyokong pengaturcaraan berorientasikan objek (OOP); Python menyokong pelbagai paradigma, termasuk pengaturcaraan OOP, fungsional dan prosedur. PHP sesuai untuk pembangunan web, dan Python sesuai untuk pelbagai aplikasi seperti analisis data dan pembelajaran mesin.

    Memilih antara php dan python: panduan Memilih antara php dan python: panduan Apr 18, 2025 am 12:24 AM

    PHP sesuai untuk pembangunan web dan prototaip pesat, dan Python sesuai untuk sains data dan pembelajaran mesin. 1.Php digunakan untuk pembangunan web dinamik, dengan sintaks mudah dan sesuai untuk pembangunan pesat. 2. Python mempunyai sintaks ringkas, sesuai untuk pelbagai bidang, dan mempunyai ekosistem perpustakaan yang kuat.

    PHP dan Python: menyelam mendalam ke dalam sejarah mereka PHP dan Python: menyelam mendalam ke dalam sejarah mereka Apr 18, 2025 am 12:25 AM

    PHP berasal pada tahun 1994 dan dibangunkan oleh Rasmuslerdorf. Ia pada asalnya digunakan untuk mengesan pelawat laman web dan secara beransur-ansur berkembang menjadi bahasa skrip sisi pelayan dan digunakan secara meluas dalam pembangunan web. Python telah dibangunkan oleh Guidovan Rossum pada akhir 1980 -an dan pertama kali dikeluarkan pada tahun 1991. Ia menekankan kebolehbacaan dan kesederhanaan kod, dan sesuai untuk pengkomputeran saintifik, analisis data dan bidang lain.

    Impak PHP: Pembangunan Web dan seterusnya Impak PHP: Pembangunan Web dan seterusnya Apr 18, 2025 am 12:10 AM

    Phphassignificantelympactedwebdevelopmentandextendsbeyondit.1) itpowersmajorplatformslikeworderpressandexcelsindatabaseIntions.2) php'SadaptabilityAldoStoScaleforlargeapplicationFrameworksLikelara.3)

    PHP vs Python: Gunakan Kes dan Aplikasi PHP vs Python: Gunakan Kes dan Aplikasi Apr 17, 2025 am 12:23 AM

    PHP sesuai untuk pembangunan web dan sistem pengurusan kandungan, dan Python sesuai untuk sains data, pembelajaran mesin dan skrip automasi. 1.PHP berfungsi dengan baik dalam membina laman web dan aplikasi yang cepat dan berskala dan biasanya digunakan dalam CMS seperti WordPress. 2. Python telah melakukan yang luar biasa dalam bidang sains data dan pembelajaran mesin, dengan perpustakaan yang kaya seperti numpy dan tensorflow.

    Cara menjalankan python dengan notepad Cara menjalankan python dengan notepad Apr 16, 2025 pm 07:33 PM

    Running Python Code di Notepad memerlukan Python Executable dan NPPExec plug-in untuk dipasang. Selepas memasang Python dan menambahkan laluannya, konfigurasikan perintah "python" dan parameter "{current_directory} {file_name}" dalam plug-in nppexec untuk menjalankan kod python melalui kunci pintasan "f6" dalam notepad.

    Golang vs Python: Perbezaan dan Persamaan Utama Golang vs Python: Perbezaan dan Persamaan Utama Apr 17, 2025 am 12:15 AM

    Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

    Golang vs Python: Prestasi dan Skala Golang vs Python: Prestasi dan Skala Apr 19, 2025 am 12:18 AM

    Golang lebih baik daripada Python dari segi prestasi dan skalabiliti. 1) Ciri-ciri jenis kompilasi Golang dan model konkurensi yang cekap menjadikannya berfungsi dengan baik dalam senario konvensional yang tinggi. 2) Python, sebagai bahasa yang ditafsirkan, melaksanakan perlahan -lahan, tetapi dapat mengoptimumkan prestasi melalui alat seperti Cython.

    See all articles