在Java中动态传参调用Python脚本
最近,又接觸到一個(gè)奇葩的接口,基于老板不斷催促趕時(shí)間的情況下,在重寫(xiě)java接口和復(fù)用已有的python腳本的兩條路中選擇了后者,但是其實(shí)后者并沒(méi)有好很多,因?yàn)槲沂且粋€(gè)對(duì)python的認(rèn)識(shí)僅限于其名稱拼寫(xiě)的人,所以,我將把我這一天內(nèi)從配置環(huán)境到最終剛成功調(diào)用腳本的過(guò)程整理一下,分享給大家。
首先,我先大體上整理一下我的思路(以下以py代替python):?
1. py腳本如何運(yùn)行??
2. java中如何調(diào)用py腳本??
3. 如何在java中向py腳本中動(dòng)態(tài)傳參。?
4. 運(yùn)行發(fā)布
接下來(lái),我將順著以上三個(gè)方面的思路來(lái)分別介紹,并展示我因此踩過(guò)的坑。
一、 py腳本如何運(yùn)行?
包括了安裝環(huán)境到簡(jiǎn)單的運(yùn)行語(yǔ)句等內(nèi)容。
二、java中如何調(diào)用py腳本?
關(guān)于java中如何調(diào)用py腳本,網(wǎng)上一搜就有很多種方法,我主要實(shí)踐了其中兩種,當(dāng)然最后采用的一種也是有原因的,下文會(huì)詳細(xì)解釋。1. 第一種,Jython?
什么是jython??
他其實(shí)是一門(mén)語(yǔ)言,并非是Java 或者Python的解釋器.用它可以實(shí)現(xiàn),java和python代碼的互相訪問(wèn)。?
如何使用jython??
如何使用Jython?
所需jar包:?
為什么最終沒(méi)有選擇使用jython??
這是我踩過(guò)的第二個(gè)坑,上面引用的的jython教程,幾個(gè)例子都能很好的運(yùn)行,函數(shù)傳參也非常方便,但在運(yùn)行現(xiàn)有的demo.py時(shí),卻一直在報(bào)下面這個(gè)錯(cuò):?
?
查詢過(guò)后,發(fā)現(xiàn)是java項(xiàng)目中引包不全的問(wèn)題,但是基于我對(duì)py的了解之少,我放棄了這個(gè)集成好的方法,畢竟需要一點(diǎn)對(duì)py的了解。這個(gè)等以后有時(shí)間再做研究。
2.于是在放棄jython之后,我還是采用了java自帶的命令行執(zhí)行py Runtime.getRuntime().exec(args),然后采用輸出流的方式用來(lái)獲取參數(shù)。?
在封裝好的py腳本的情況下,如果你不需要傳入?yún)?shù)而只需要執(zhí)行這個(gè)py文件的話,那么直接百度就可以獲取得到很多寫(xiě)好的代碼,我這里提供一種我這次使用的:
然后看到這里,只需要修改Runtime.getRuntime().exec(“”)中的參數(shù)改為自己相應(yīng)的文件路徑即可,就可以輕松結(jié)束本次分享,但是,總有但是,我們大多數(shù)情況下調(diào)用一個(gè)復(fù)用的部分,都是為了傳入不同的參數(shù)以獲取相應(yīng)的結(jié)果,那么請(qǐng)繼續(xù)往下看。
三、如何在java中向py腳本中動(dòng)態(tài)傳參。
Java代碼:
py代碼:
import sys print "腳本名:", sys.argv[0] for i in range(1, len(sys.argv)): print "參數(shù)", i, sys.argv[i]運(yùn)行結(jié)果:?
那么,醬紫就大功告成啦。你只需要根據(jù)py腳本中所需要的參數(shù)傳進(jìn)去就好啦。
運(yùn)行發(fā)布
運(yùn)行發(fā)布有什么好說(shuō)的呢??
這里也有一點(diǎn)需要注意的,就是服務(wù)器環(huán)境的配置,linux一般都是集成好的,其他的我不太清楚,但是最重要的一點(diǎn),在上線調(diào)試時(shí),一定要注意py文件的路徑存放問(wèn)題。就醬。
總結(jié)
從一開(kāi)始的完全摸不到頭腦,到現(xiàn)在能夠調(diào)用成功,這不到一天的時(shí)間,壓力卻是很大的,面對(duì)未知的知識(shí),無(wú)從下手的感覺(jué)我想大家也都經(jīng)歷過(guò),但在這里,我十分想感謝那些無(wú)私幫助我的旁友們~多交流一下,別人不一定有時(shí)間能幫你解決,但能夠提供思路的情況下,就能夠早一點(diǎn)找到正確的方向,比如”P(pán)ython獲得命令行傳參“這個(gè)東西,我一開(kāi)始真是連百度搜索什么都不知道,搜到的東西可能跟你需要的完全不搭邊,那么有一個(gè)方向也是好的。當(dāng)然,這個(gè)方向完全正確,奠定了后面動(dòng)態(tài)傳參能夠成功的基礎(chǔ),哈哈。?
這個(gè)博客只顯示了我的一個(gè)特點(diǎn):我不生產(chǎn)博客,我只是博客的搬運(yùn)工~
附錄:遺留問(wèn)題
項(xiàng)目中獲取到的中文參數(shù),一向py腳本中傳參就顯示亂碼,只有中文出現(xiàn)這個(gè)情況,到目前也沒(méi)有找到解決方法,那么現(xiàn)在采用了一種曲線救國(guó)的方式,但是非常的不好,然而目前并沒(méi)有發(fā)現(xiàn)更好的解決方法,放在這里待以后繼續(xù)研究,或者大家能有什么好方法也希望能夠多多交流~
原文地址:https://blog.csdn.net/thorny_v/article/details/61417386
轉(zhuǎn)載于:https://www.cnblogs.com/jingsupo/p/java-python.html
總結(jié)
以上是生活随笔為你收集整理的在Java中动态传参调用Python脚本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Codeforces 989C (构造)
- 下一篇: BZOJ4698: Sdoi2008 S