最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在java中使用Jython

 更新時(shí)間:2022年03月01日 16:42:02   作者:_lrs  
這篇文章主要介紹了如何在java中使用Jython,由于項(xiàng)目中需要用到Java調(diào)用Python的腳本,來實(shí)現(xiàn)一些功能,就對(duì)jython做了一些了解,通過jython可以實(shí)現(xiàn)java對(duì)python腳本的調(diào)用,需要的朋友可以參考一下

前言:

由于項(xiàng)目中需要用到Java調(diào)用Python的腳本,來實(shí)現(xiàn)一些功能,就對(duì)jython做了一些了解,通過jython可以實(shí)現(xiàn)java對(duì)python腳本的調(diào)用。

一、Jython是什么

Jython 是 Python 的純 Java 實(shí)現(xiàn)。她無縫地結(jié)合了 Java 類與 Python,使用戶能以 Python 語(yǔ)言的語(yǔ)法編寫在 Java 虛擬機(jī)上運(yùn)行的 軟件。它的特點(diǎn)有:與相似的 Java 程序相比,Jython 極大的的減少了編程代碼量。Jython 同時(shí)擁有解釋器和編譯器,使其無需編譯就可以測(cè)試程序代碼。

二、使用步驟

1.引入依賴

代碼如下(示例):

? ??? ?<dependency>
? ? ? ? ? ? <groupId>org.python</groupId>
? ? ? ? ? ? <artifactId>jython-standalone</artifactId>
? ? ? ? ? ? <version>2.7.0</version>
? ? ? ? </dependency>

2.調(diào)用代碼

?? ??? ?//功能:從word中找出對(duì)應(yīng)的加密后的數(shù)據(jù),加密算法是hash.md5_crypt
??? ??? ?//原始數(shù)據(jù)
? ? ? ? List<String> word = new ArrayList<>();
? ? ? ? word.add("123");
? ? ? ? word.add("456");
? ? ? ? //加密后數(shù)據(jù)
? ? ? ? List<String> cryptWord = new ArrayList<>();
? ? ? ? cryptWord.add("$1$KP074k5L$GkgfZVwByM0FQt4l.KLoh/");
? ? ? ? cryptWord.add("$1$zTxoz1fL$HKSbEyNFHGkLgAHZUTjmz.");

? ? ? ? String pythonFilePath = "jython_test.py";
? ? ? ? String pythonFileMethod = "verify";

? ? ? ? PythonInterpreter interpreter = new PythonInterpreter();
? ? ? ? ClassPathResource resource = new ClassPathResource(pythonFilePath);
? ? ? ? InputStream inputStream = resource.getInputStream();
? ? ? ? interpreter.execfile(inputStream);
? ? ? ? PyFunction verify = interpreter.get(pythonFileMethod, PyFunction.class);
? ? ? ? //調(diào)用
? ? ? ? PyObject pyObject = verify.__call__(new PyList(word), new PyList(cryptWord));
? ? ? ? List<String> result = (List<String>)pyObject.__tojava__(List.class);
? ? ? ? System.out.println(result);

? ? ? ? interpreter.close();

輸出結(jié)果:

[‘word:456, crypt_word:1 11KP074k5L$GkgfZVwByM0FQt4l.KLoh/’, ‘word:123, crypt_word:1 11zTxoz1fL$HKSbEyNFHGkLgAHZUTjmz.’]

2.python腳本

from passlib.hash import md5_crypt

def verify(word,crypt_word):
? ? result=[]
? ? for crypt_w in crypt_word:
? ? ? ? for w in word:
? ? ? ? ? ? if md5_crypt.verify(w, crypt_w):
? ? ? ? ? ? ? ? item = 'word:{}, crypt_word:{}'.format(w,crypt_w)
? ? ? ? ? ? ? ? result.append(item)
? ? ? ? ? ? ? ? break
? ? return result

三、問題

1.報(bào)錯(cuò):ImportError: No module named passlib

報(bào)錯(cuò)提示說沒有安裝passlib庫(kù),則需要導(dǎo)入passlib庫(kù),才能使用from passlib.hash import md5_crypt
linux上可以通過pip install passlib 命令安裝
windows:例如可以使用spyder執(zhí)行pip install passlib安裝
如果安裝后還是報(bào)錯(cuò),則可能是由于庫(kù)安裝路徑不在path里,需要在腳本里引入安裝路徑,例如:

import sys
sys.path.append(‘D:\tools\Anaconda\lib\site-packages')

或通過代碼的方式引入:

interpreter.exec(“import sys”);
interpreter.exec(“sys.path.append(‘D:\tools\Anaconda\lib\site-packages')”);

2.報(bào)錯(cuò):Cannot create PyString with non-byte value

在源碼中可以找到報(bào)錯(cuò)的地方:

? public PyString(PyType subType, String string) {
? ? ? ? super(subType);
? ? ? ? if (string == null) {
? ? ? ? ? ? throw new IllegalArgumentException("Cannot create PyString from null");
? ? ? ? } else if (!isBytes(string)) {
? ? ? ? ? ? throw new IllegalArgumentException("Cannot create PyString with non-byte value");
? ? ? ? }
? ? ? ? this.string = string;
? ? }

再進(jìn)入 isBytes(string) 方法:

?private static boolean isBytes(String s) {
? ? ? ? int k = s.length();
? ? ? ? if (k == 0) {
? ? ? ? ? ? return true;
? ? ? ? } else {
? ? ? ? ? ? char c = 0;
? ? ? ? ? ? // 每次循環(huán)計(jì)算8次
? ? ? ? ? ? while (k > 8) {
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? }
? ? ? ? ? ? // 計(jì)算最后剩下的不足8次的
? ? ? ? ? ? while (k > 0) {
? ? ? ? ? ? ? ? c |= s.charAt(--k);
? ? ? ? ? ? }
? ? ? ? ? ? // 比較大小
? ? ? ? ? ? return c < 0x100;
? ? ? ? }
? ? }

該方法是對(duì)傳進(jìn)來的字符串進(jìn)行每個(gè)字符的求或運(yùn)算,最終結(jié)果要小于 0x100,也就是256,也就是說每個(gè)字符的大小是不能超過256的。
而我這里報(bào)錯(cuò)的原因是在創(chuàng)建PythonInterpreter 時(shí)傳入的python文件路徑里帶了中文。

到此這篇關(guān)于如何在java中使用Jython的文章就介紹到這了,更多相關(guān)在java中使用Jython內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Feign性能優(yōu)化代碼實(shí)例

    Spring Cloud Feign性能優(yōu)化代碼實(shí)例

    這篇文章主要介紹了Spring Cloud Feign性能優(yōu)化代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot如何使用Scala進(jìn)行開發(fā)的實(shí)現(xiàn)

    SpringBoot如何使用Scala進(jìn)行開發(fā)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot如何使用Scala進(jìn)行開發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 簡(jiǎn)單捋捋@RequestParam 和 @RequestBody的使用

    簡(jiǎn)單捋捋@RequestParam 和 @RequestBody的使用

    這篇文章主要介紹了簡(jiǎn)單捋捋@RequestParam 和 @RequestBody的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java中的Sentinel持久化規(guī)則啟動(dòng)

    Java中的Sentinel持久化規(guī)則啟動(dòng)

    這篇文章主要介紹了Java中的Sentinel持久化規(guī)則啟動(dòng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot實(shí)現(xiàn)阿里云短信接口對(duì)接的示例代碼

    SpringBoot實(shí)現(xiàn)阿里云短信接口對(duì)接的示例代碼

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)阿里云短信接口對(duì)接的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Jenkins自動(dòng)部署Net Core過程圖解

    Jenkins自動(dòng)部署Net Core過程圖解

    這篇文章主要介紹了Jenkins自動(dòng)部署Net Core過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Spring Boot 開發(fā)私有即時(shí)通信系統(tǒng)(WebSocket)

    Spring Boot 開發(fā)私有即時(shí)通信系統(tǒng)(WebSocket)

    本文利用Spring Boot作為基礎(chǔ)框架,Spring Security作為安全框架,WebSocket作為通信框架,實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天和群聊天
    2017-04-04
  • Java線程關(guān)閉的3種方法

    Java線程關(guān)閉的3種方法

    這篇文章介紹了Java線程關(guān)閉的3種方法,有需要的朋友可以參考一下
    2013-10-10
  • Java中的StringBuilder性能測(cè)試

    Java中的StringBuilder性能測(cè)試

    這篇文章主要介紹了Java中的StringBuilder性能測(cè)試,本文包含測(cè)試代碼和測(cè)試結(jié)果,最后得出結(jié)論,需要的朋友可以參考下
    2014-09-09
  • SpringBoot實(shí)現(xiàn)微信支付接口調(diào)用及回調(diào)函數(shù)(商戶參數(shù)獲取)

    SpringBoot實(shí)現(xiàn)微信支付接口調(diào)用及回調(diào)函數(shù)(商戶參數(shù)獲取)

    本文詳細(xì)介紹了使用SpringBoot實(shí)現(xiàn)微信支付接口調(diào)用及回調(diào)函數(shù)的步驟,提供了代碼實(shí)現(xiàn)的具體步驟和工具類的創(chuàng)建,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評(píng)論

宁远县| 杭锦旗| 缙云县| 治县。| 武山县| 阜城县| 丰县| 彭山县| 永昌县| 共和县| 保康县| 醴陵市| 隆化县| 昌都县| 景洪市| 湖南省| 绥棱县| 乾安县| 察哈| 潜山县| 瓮安县| 井研县| 石屏县| 游戏| 镇康县| 林西县| 宜丰县| 广灵县| 舞钢市| 津市市| 临桂县| 渝北区| 洪湖市| 区。| 华阴市| 永泰县| 类乌齐县| 梅河口市| 大关县| 新津县| 林口县|