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