date: 2017-03-14 21:54:21
因?yàn)檫@篇Java調(diào)用Python 之前試過用Java調(diào)用Python制市,到真正用的時(shí)候才發(fā)現(xiàn)是一個(gè)烏龍食茎。
error
錯(cuò)誤就是我的程序太多了厂庇,程序命名混亂癣猾,導(dǎo)致執(zhí)行了不該執(zhí)行的程序,而我以為它跑通了霎匈。
這個(gè)方法:
Runtime.getRuntime().exec("python D:\\studentdb.py id password");
并不能傳遞形參!B彝丁咽笼!
只可以這樣使用:
Runtime.getRuntime().exec("python D:\studentdb.py 12345678 666666");
這樣是可以把學(xué)號和密碼傳入Python文件,并且執(zhí)行戚炫。
而前者的形參方法剑刑,是會(huì)直接把形參當(dāng)成字符串直接傳進(jìn)Python...
這也就是說,這個(gè)方法只可以傳遞字符串双肤。
前幾天調(diào)到半夜發(fā)現(xiàn)的真理叛甫。
那么還有解決辦法嗎?
肯定有杨伙,要么是我不知道,要么是我不會(huì)萌腿。
新方法Jython
查找資料發(fā)現(xiàn)這個(gè)第三方包是可以用來傳遞Python參數(shù)并且執(zhí)行代碼限匣。
之前也有注意到這個(gè)方法,但是由于考慮到它的復(fù)雜性毁菱,和Runtime.getRuntime().exec()方法的簡單性米死,就沒有往這里想,畢竟程序員是最懶的贮庞。
首先得下載Jython這個(gè)第三方包峦筒。
調(diào)試記錄
1、console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.
Run As>Run Configurations,選擇第二個(gè)頁簽Arguments,在VM arguments中添加-Dpython.console.encoding=UTF-8即可窗慎,然后Apply>Run就行了
2物喷、java用jython.jar調(diào)用python腳本,腳本中import了第三方庫時(shí)遮斥,報(bào)錯(cuò):import xxx: no module named xxx.
兩種解決方法:
(1)下載或pip install需要的第三方庫峦失,將jython.jar改成jython.zip,并解壓縮术吗,將下載的第三方庫(以庫名定義的文件夾)放到j(luò)ython文件夾下的/Lib或/Lib/site-packages下尉辑,最后將jython文件夾重新打包(注意:打包時(shí)不要直接對jython文件夾打包,只打包jython根目錄下的所有文件)较屿,并改后綴為.jar隧魄,配置到j(luò)ava的工程目錄中(構(gòu)建路徑)。
(2)配置python的系統(tǒng)路徑隘蝎,java解析腳本時(shí)會(huì)到sys.path中找import的第三方庫购啄,只要sys.path中能找到第三方庫的文件夾即可。
注:在java端通過語句:PySystemState sys = Py.getSystemState();
System.out.println(sys.path.toString());打印路徑信息嘱么。
最后的bug與悔悟
一步步的將各個(gè)遇到的bug擊破闸溃,遇到最大的障礙:識(shí)別不了requests包。
和隊(duì)友們思前想后,覺得這可能是和Python的版本有關(guān)系辉川。
我們統(tǒng)一用的是Python35表蝙,從這個(gè)第三包的名字就可以的看出Jython2.7就能看得出它是支持Python27的。
又又又想起來《笨辦法學(xué)Python》里的一段話乓旗。
不要用Python3府蛇!
不要用Python3!屿愚!
不要用Python3;憧纭!妆距!
因?yàn)镻ython3要適配Python2的所有第三方包會(huì)花費(fèi)很長的時(shí)間穷遂!
但是事物的發(fā)展不就是要走在最前沿的嗎!
這個(gè)問題肯定有它的解決辦法娱据。只是我不知道和不會(huì)蚪黑。
現(xiàn)在最蠢的解決辦法有兩種:
- 重寫Python3程序?yàn)镻ython2
- 后臺(tái)將獲得的學(xué)號密碼生成為CSV文件保存到本地,再直接執(zhí)行Python程序中剩。Python程序里讀取本地CSV文件忌穿,獲取學(xué)號密碼,進(jìn)行爬蟲活動(dòng)结啼,存數(shù)據(jù)到MySQL掠剑,再刪除CSV。
第一種方法需要花時(shí)間郊愧。
第二種方法太笨朴译,在處理多并發(fā)的活動(dòng)時(shí)可能會(huì)崩塌。而且效率低属铁。
思前想后动分,為了以后工作的順利進(jìn)行,還是選擇第一種吧红选,重新寫Python程序?yàn)?澜公。