Java調用Python

來源:互聯網
上載者:User
今天遇到Java調用一個Python指令碼的問題,糾結了大半天,遇到各種問題。網上搜尋的大部分都是用jython,但是我想要調用的python指令碼裡有import urllib,這個urllib也不是什麼第三方擴充庫,在python的安裝path下的Lib下就有,在python命令列下肯定是能找到的。但是用jython的話,sys的path裡面就太少了。範例程式碼:

import org.python.core.Py;import org.python.core.PySystemState;import org.python.util.PythonInterpreter;public class Test3 {    /**     * @param args     */    public static void main(String[] args) {                PythonInterpreter interpreter = new PythonInterpreter();                  PySystemState sys = Py.getSystemState();         //sys.path.add("D:\\jython2.5.2\\Lib");        System.out.println(sys.path.toString());                 interpreter.exec("print 'hello'");                  interpreter.exec("import sys");        interpreter.exec("print sys.path");        //        interpreter.exec("import urllib");//        interpreter.exec("print urllib");    }}

列印出來的sys.path為:

Txt代碼

['D:\\eclipse_jee_workspace\\ZLabTest\\lib\\Lib', '__classpath__', '__pyclasspath__/']

這兒就只有eclipse的工程的路徑包含了,所以當然找不到urllib啦。而在命令列下列印sys.path為:


用jython差的lib庫少太多了,也懶得用類似sys.path.add("D:\\jython2.5.2\\Lib");一個一個加了,所以果斷放棄jython。

然後查到可以用Runtime.getRuntime().exec("python test.py");範例程式碼如下:

import java.io.BufferedReader;import java.io.InputStreamReader;public class Test5 {        public static void main(String[] args){                try{                        System.out.println("start");                        Process pr = Runtime.getRuntime().exec("python test.py");                                                BufferedReader in = new BufferedReader(new                                InputStreamReader(pr.getInputStream()));                        String line;                        while ((line = in.readLine()) != null) {                            System.out.println(line);                        }                        in.close();                        pr.waitFor();                        System.out.println("end");                } catch (Exception e){                            e.printStackTrace();                        }                }}

test.py的檔案內容為:

Python代碼

import sys  import urllib  print "hello"  print sys.path

java程式啟動並執行結果為:

Txt代碼

start  hello  ['D:\\eclipse_jee_workspace\\ZLabTest', 'C:\\Windows\\system32\\python27.zip', 'D:\\Python27\\DLLs', 'D:\\Python27\\lib', 'D:\\Python27\\lib\\plat-win', 'D:\\Python27\\lib\\lib-tk', 'D:\\Python27', 'D:\\Python27\\lib\\site-packages']end


這就比較對了。但是中途還是遇到了很多問題,在Eclipse中運行上面的java程式拋出異常:

java.io.IOException: Cannot run program "python": CreateProcess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)

at java.lang.Runtime.exec(Runtime.java:593)

at java.lang.Runtime.exec(Runtime.java:431)

at java.lang.Runtime.exec(Runtime.java:328)

at com.mysrc.Test5.main(Test5.java:10)

Caused by: java.io.IOException: CreateProcess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.ProcessImpl.create(Native Method)

at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)

at java.lang.ProcessImpl.start(ProcessImpl.java:30)

at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)

... 4 more

就是沒法調用python程式,而如果是在命令列下用javac編譯,然後java執行的話肯定是對的。怎麼才能在Eclipse裡也能正常運行了,網上查了半天,在run configurations->environment建立一個PATH,值設為安裝的python的路徑,再運行就OK了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.