如何在Jython中使用本机Cpython扩展
我有一个python脚本,其中我使用了python包,比如numpy、scipy等。当我试图使用Jython运行脚本时,它会给出一个异常(“导入错误”) 我的python代码是:如何在Jython中使用本机Cpython扩展,python,numpy,jython,random-forest,Python,Numpy,Jython,Random Forest,我有一个python脚本,其中我使用了python包,比如numpy、scipy等。当我试图使用Jython运行脚本时,它会给出一个异常(“导入错误”) 我的python代码是: import numpy as np #import pandas as pd #import statsmodels.api as sm #import matplotlib.pyplot as plt #from patsy import dmatrices #from sklearn.linear_model i
import numpy as np
#import pandas as pd
#import statsmodels.api as sm
#import matplotlib.pyplot as plt
#from patsy import dmatrices
#from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
import pandas
import pickle
#from numpy import genfromtxt, savetxt
import csv
trainingData="/home/gauge/Documents/TrainingData1/Training4.csv"
testFile = "/home/gauge/Documents/TrainingData1/TestCase1.csv"
PredictionOutput="/home/gauge/Documents/TrainingData1/result4.csv"
def make_x_and_y(filepath):
x_y = []
with open(filepath, 'rt') as f:
reader = csv.reader(f)
for idx,row in enumerate(reader):
if idx<0: continue
x_y.append([row[2],row[3],row[4],row[5],row[6],row[7],row[8]])
#x_y.append([row[2],row[3],row[4],row[5],row[6],row[8]])
#print x
X = [i[:-1] for i in x_y]
y = [i[-1] for i in x_y]
X = np.array(X,dtype='f8')
#print file_path
y = np.array(y,dtype='f8')
#print X.shape, y.shape
return X,y
def build_model(filepath):
X,y = make_x_and_y(filepath)
target = np.array(y,dtype='f8')
train = np.array(X,dtype='f8')
model = RandomForestClassifier(n_estimators=150,max_features=5,random_state=1,max_depth=10)
model.fit(train, target)
file_object=open("/home/gauge/Documents/pickle/model.pkl",'wb')
pickle.dump(model,file_object,-1)
return model
def predict():
#for index in range(10,200):
model = build_model(trainingData)
X=[]
data=[]
with open(testFile,'rt') as f:
reader = csv.reader(f)
for idx,row in enumerate(reader):
if idx<0: continue
data.append([row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7]])
X.append([row[2],row[3],row[4],row[5],row[6],row[7]])
X=np.array(X,dtype='f8')
if (len(X) != 0 ):
predicted = model.predict(X)
# prob=model.predict_proba(X)[0]
#print prob
file_table=pandas.read_csv("/home/gauge/Documents/TrainingData1/testdata2.csv",sep=",",quoting=1)
list=[]
list =file_table['Correct']
#print list
count=0
count1=0
with open(PredictionOutput, 'w') as fp:
a = csv.writer(fp)
for idx,p in enumerate(predicted):
#print X[idx]
"""
if list[idx]==0 and int(p)==1:
count+=1
elif list[idx]==1 and int(p)==0:
count1+=1
print "FP -",count,"FN -",count1
"""
prob = model.predict_proba(X[idx])[0][0]
prob1=model.predict_proba(X[idx])[0][1]
print prob,prob1
#a.writerows([[str(data[idx][0]),str(data[idx][1]),int(p)]])
if prob1>=0.90:
a.writerows([[str(data[idx][0]),str(data[idx][1]),int(p),prob,prob1]])
if list[idx]==0:
count+=1
else:
a.writerows([[str(data[idx][0]),str(data[idx][1]),0,prob,prob1]])
if list[idx]==1:
count1+=1
print "FP -",count,"FN -",count1
predict()
您不能直接使用Jython的C扩展,因为它们绑定到实现。Jython内部非常不同,它与CPython在C API级别上不兼容 如果要将Jython连接到CPython C扩展,则需要在它们之间进行某种连接。但是,目前还没有一个可靠的、生产就绪的库可以做到这一点
关于一些备选方案,请参见这个老问题:您不能直接使用Jython的C扩展,因为它们绑定到实现。Jython内部非常不同,它与CPython在C API级别上不兼容 如果要将Jython连接到CPython C扩展,则需要在它们之间进行某种连接。但是,目前还没有一个可靠的、生产就绪的库可以做到这一点
另请参见这个老问题,了解一些替代方案:我发现了同样的东西,但不知道如何使用它。@Narendrawat我也不知道。它看起来很有希望,但肯定还没有做好生产准备。如果我是你,我要么完全转储Jython,要么在不可能的情况下,通过命名管道或套接字在单独的进程中运行Jython和CPython。在同一个过程中混合使用Java和CPython肯定会让你非常头疼。我发现了同样的东西,但不知道如何使用它。@Narendrawat我也不知道。它看起来很有希望,但肯定还没有准备好生产。如果我是你,我要么完全转储Jython,要么在不可能的情况下,通过命名管道或套接字在单独的进程中运行Jython和CPython。在同一进程中混合java和cPython肯定会给你带来很多麻烦。另外要考虑的是,在那里有一些不错的java数字库,可以从Jython中使用(如果你有充分的理由想要使用Jython而不是cPython)另外要考虑的是,在那里有一些不错的java数字库,可以从Jython中使用(如果你有充分的理由想要使用Jython而不是cPython)。
package com.gauge.ie.Jython;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
public class PyJava
{
public static void main(String args[])
{
PythonInterpreter py=new PythonInterpreter();
py.execfile("/home/gauge/Spyder/Classifier.py");
PyObject obj=py.get("a");
System.out.println("val: "+obj.toString());
}
}