1. 程式人生 > >Jython:java呼叫python檔案之第三方包路徑問題

Jython:java呼叫python檔案之第三方包路徑問題

本方法解決python程式碼的可移植性,不需要在新機器上配置python環境,只通過安裝jython的方式將python程式碼嵌入java工程

1. Jython如何安裝

傻瓜式下一步安裝方式,路徑最好和工程選在同一目錄下。

2. 執行python程式碼

舉個簡單例子,安裝好java環境及eclipse之後,copy如下程式碼即可執行。註釋部分為執行檔案的方式,需要新建檔案後去掉註釋執行。

import java.io.IOException;
import org.python.util.PythonInterpreter;  
public class test {  
	public static void main(String args[]) throws IOException {  
		PythonInterpreter interpreter = new PythonInterpreter(); 
		// 執行python語句 
		interpreter.exec("a = \"hello, Jython\"");  
		interpreter.exec("print a");  
		// 執行python檔案
		//  interpreter.exec("filepy = \"E:\\test.py\"");  
		//  interpreter.execfile(filepy);  ///執行python py檔案  
		//  filepy.close(); 
	} 
}  
3. 處理第三方包

在檔案執行方式中,

第一種情況:如果.py檔案中包含同一目錄的自定義包,則在eclipse工程下可正常呼叫。

第二種情況:如果包含第三方包,需要拷貝到當前目錄下。

第三種情況:由於路徑問題無法呼叫。Jython/lib檔案下有大量第三方包,如os, re, __future__,重複拷貝費時費力,這時可手動修改path路徑。(推薦)

修改路徑有兩種方式:

(1) Java方式

import org.python.core.Py;
import org.python.core.PySystemState;
System.out.println(sys.path.toString());    // previous
PySystemState sys = Py.getSystemState();   
sys.path.add("E:\\sacaapm-paserver\\src-python\\jython\\Lib"); 
System.out.println(sys.path.toString());   // later

將程式碼嵌入part 2程式碼,得到完整程式碼後執行,可以看到前後路徑發生變化。

(2) python方式

 interpreter.exec("import sys"); 
 interpreter.exec("print sys.path");

(3) 靈活運用以上兩種方式或其組合形式。

當import sys時報出“sys模組不存在”的錯誤,建議使用第一種。

完整程式碼如下:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.python.core.Py;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;  

public class test {  
	public static void main(String args[]) throws IOException {  
		  PythonInterpreter interpreter = new PythonInterpreter();  
		  PySystemState sys = Py.getSystemState();   
		  sys.path.add("E:\\src-python\\jython\\Lib");     
		  interpreter.exec("import sys"); 
		  interpreter.exec("print sys.path");
		  interpreter.exec("path = \"E:\\src-python\\jython\\Lib\"");
		  interpreter.exec("sys.path.append(path)"); 
		  interpreter.exec("print sys.path");  
		  interpreter.exec("a=3; b=5;");
		  InputStream filepy = new FileInputStream("E:\\input.py");   
		  interpreter.execfile(filepy);
		  filepy.close();     
	}
}
執行結果:
['E:\\lib\\Lib', '__classpath__', '__pyclasspath__/', u'E:\\src-python\\jython\\Lib']
['E:\\lib\\Lib', '__classpath__', '__pyclasspath__/', u'E:\\src-python\\jython\\Lib', 'E:\\src-python\\jython\\Lib']
a/b= 0.6

E:\\input.py檔案程式碼:

from __future__ import division
print "a/b=",a/b

其中變數a, b的值由java傳入。

相關推薦

Jythonjava呼叫python檔案第三方路徑問題

本方法解決python程式碼的可移植性,不需要在新機器上配置python環境,只通過安裝jython的方式將python程式碼嵌入java工程 1. Jython如何安裝 傻瓜式下一步安裝方式,路徑最好和工程選在同一目錄下。 2. 執行python程式碼 舉個簡單例子,安

idea中通過java程式直接呼叫python檔案

專案用python開發時大量引入了外包,當需要在java中使用該程式碼時考慮要麼轉成java語言(太麻煩),要麼打包成jar(沒找到合適的方法),參考了一些java呼叫python檔案方法,並不適合我目前開發的環境,下面給出idea下直接呼叫的方法。 一、在i

jython環境安裝、java呼叫python、中文亂碼問題

1、jython安裝 jython下載地址 http://www.jython.org/downloads.html (1)直接雙擊“jython-installer-2.7.0.jar”一步步安裝即可 (2)配置環境變數,     新建系統環境變數:  JYTHON_HO

【Loadrunner】 java vuser 採用cmd方式呼叫python檔案,執行zeromq請求和資料protobuf反序列化

        背景:由於第一次接觸zeromq,對其瞭解甚少,於是度娘對其原理了解一番後,就開始了接下來實踐“坑”中,首先在LR中,對於用socekt、java、c那種方式來實現,通過抓包對比,以及socekt和c語言可實現,但複雜度有點”呵呵“,而用java開發的zero

JythonJava如何傳值給Python

想在Java工程中呼叫Python指令碼,最關鍵的是python指令碼需要使用Java實時傳遞過來的變數。因此麻煩了,到處找教程。中文教程為零,還好有Stack Over Flow,輸入關鍵字:jython java passing  variable topython,果真

Java併發(一) Java呼叫native檔案

1.2 環境配置 1.2.1 OpenJDK 安裝 yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 獲取java home: dirname $(readlink $(readlink $(which java))) 設定環境變數: v

JavaSE入門學習23Java面向對象構造方法

ons 抽象類 什麽 ont 機會 語法 好的 error return 學了JavaSE面向對象這一部分,也該對構造方法做一個總結了。 一構造方法 在多數情況下,初始化一個對象的終於步驟是去調用這個對象的構造方法。構造

ElasticSearch(三)Java操作ElasticSearch索引CRUD

transport delete end std testin python網絡 search ava socket 1 package com.gxy.ESChap01; 2 3 import java.net.InetAddress; 4 impor

java 呼叫音訊檔案

public static void main(String[] args) throws MalformedURLException, InterruptedException { String fileName="F:\\KuGou\\test.wav"; //選擇播放

Python路(十三)異常處理 python基礎異常處理

python基礎之異常處理   基本異常處理   舉個簡單的例子 num = input(">>>") try: res = int(num) print(res)

java調Python指令碼(四)java返回Python錯誤日誌

上一篇java調Python指令碼時沒有返回錯誤的日誌提醒行等,在這裡補上,主要用java.lang.Process.getErrorStream() 方法獲取子程序的錯誤流​​。資料流獲取由該Process物件表示的程序的錯誤輸出流的管道的資料。 1、java程式碼: pub

java調Python指令碼(二)java調Python亂碼問題

java調Python返回結果出現亂碼解決: Python指令碼編碼格式已經用了utf-8,但是返回還是亂碼,說明是java這邊傳過去編碼有問題。 1、Python編碼格式: 2、一般我們中文文字編碼格式常用的有:UTF-8,GBK,GB2312。分別試一下就知道了:

Runtime.getRuntime().exec()實現Java呼叫python程式

使用Runtime.getRuntime().exec()來實現Java呼叫python,呼叫程式碼如下所示: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

學習資源分享| 第一篇JavaPython,PHP,VUE,Angular,React一網打盡

公眾號回覆“學習”,拉你進程式設計師技術討論群,乾貨資源第一時間分享。 後端: java: 慕課網Activiti6.0工作流引擎深度解析與實戰: 慕課網BAT大牛親授 基於ElasticSearch的搜房網實戰: 慕課網BAT網際網路公司校招面試題: 慕課

關於JAVA呼叫Python指令碼並傳遞引數

JAVA 程式呼叫python指令碼目前存在兩種形式。第一種:運用JAVA本身的自帶功能;第二種:使用jython Jar包的自帶方法來呼叫python指令碼 呼叫準備: 首先你要在本地獲取LINUX環境安裝python環境,如果是JYTHON的話需要安裝JYTHON,兩

讀書筆記java多執行緒執行緒同步

閱讀的書籍:《java瘋狂講義》 關鍵詞:執行緒安全問題,同步程式碼塊,同步方法,釋放同步監視器的鎖定,同步鎖,死鎖 執行緒安全問題:當使用多個執行緒來訪問同一個資料時,會導致一些錯誤情況的發生 到底什麼是執行緒安全問題呢,先看一個經典的案例:銀行取錢的問題

bat檔案-呼叫Python檔案

    初次學習bat批處理,利用bat檔案呼叫python檔案及bat檔案。 set pwd=%cd% rmdir %pwd%\code /s/q call %pwd%\bat\c600_code_xcopy.bat G: cd %pwd% cd .. python

java呼叫檔案(.bat)並動態傳參

java程式碼: package test; import java.io.IOException; public class TestMain { public static void main(String [] args) { try { Proc

Java呼叫Python指令碼(Python3,Windows10系統)

介紹下如何在Java中呼叫Python指令碼,可能是目前最簡單的方法(●’^'●)。 又是師姐的任務,要求把我的Python程式整合到純Java的系統中。於是在網上又是一頓搜尋,不乏各種厲害的方法。其中最常見的是Jython,聽起來十分高大上,直接把世界上

MongoDB工具類java操作對檔案的增刪查改

前言   1.MongoDB,是一個基於分散式檔案儲存的資料庫,是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富、最像關係資料庫的,它的特點是高效能、易部署、易使用,儲存資料非常方便。在實際的專案操作中,我們不僅能用來儲存各種複雜的