2015-05-12 26 views
6

Başkalarının python kullanmasına izin vermek için uygulamanızın bir arabirimini prototip olarak yapıyorum, uygulamamız java'da yazılmıştır. Bazı verilerimizi java uygulamasından python koduna aktarmak istiyorum ancak bir nesneyi python'a nasıl geçireceğime emin değilim. Jython'u kullanarak basit parametreleri kullanarak basit bir java-> python işlev çağrısı yaptım ve yapmaya çalıştığım şey için çok yararlı buldum.java nesnesini python'a aktarma

public class TestObject 
{ 
    private double[] values; 
    private int length; 
    private int anotherVariable; 

    //getters, setters 
} 
+0

:

o ayrıntıları sahip olacak bu bağlantıyı bakın. Yaptığım şey, çalıştırılabilir (exe) bir python kodu oluşturdum ve java programımdan parametrelerim değerini geçtim. Bu sizin için uygunsa o zaman yardımcı olurum. Lütfen cevap verin!! – Santhucool

+0

olabilir, paylaşmak için bir örnek var mı? – user1584120

+0

Cevaplandı Lütfen kontrol edin – Santhucool

cevap

4

Bir çözüm: Sonra bir işlev/sınıfa girdi olarak Python/Jython bunu nasıl kullanabileceğinizi aşağıda sınıfı, önüne alındığında. Serileştirmek/serpiştirmek için bir çeşit mesaj sistemini, kuyruğu veya aracıyı kullanabilir veya python ile java arasındaki mesajları iletebilirsiniz. Daha sonra python veya java'da işlenecek sıralara iş vermek için bazı işçiler/yapımcı/tüketiciler oluşturun.

Ayrıca ilham için göz atmayı düşünün: https://www.py4j.org/

py4j pyspark ve Hadoop türü şeyler için tarafından/yoğun olarak kullanılır.

Sorunuzu daha çabuk yanıtlamak için. .

import org.apache.commons.io.FileUtils; 
import org.json.simple.JSONObject; 
//import org.json.simple.JSONObject; 


public class TestObject 
{ 
    private double[] values; 
    private int length; 
    private int anotherVariable; 
    private boolean someBool; 
    private String someString; 

    //getters, setters 

    public String toJSON() { 
     JSONObject obj=new JSONObject(); 
     obj.put("values",new Double(this.values)); 
     obj.put("length",new Integer(this.length)); 
     obj.put("bool_val",new Boolean(this.SomeBool)); 
     obj.put("string_key",this.someString); 
     StringWriter out = new StringWriter(); 
     obj.writeJSONString(out); 
     return out.toString(); 
    } 

    public void writeObject(){ 
      Writer writer = new BufferedWriter(
           new OutputStreamWriter(
            new FileOutputStream("anObject.json"), "utf-8") 
          ) 
          ) 

      writer.write(this.toJSON()); 
    } 

    public static void setObject(){ 
     values = 100.134; 
     length = 12; 
     anotherVariable = 15; 
     someString = "spam"; 
    } 
} 

Ve Python:

Örnek json-simple kullanılarak

class DoStuffWithObject(object): 
    def __init__(self,obj): 
     self.obj = obj 
     self.changeObj() 
     self.writeObj() 

    def changeObj(self): 
     self.obj['values'] = 100.134; 
     self.obj['length'] = 12; 
     self.obj['anotherVariable'] = 15; 
     self.obj['someString'] = "spam"; 

    def writeObj(self): 
     ''' write back to file ''' 
     with open('anObject.json', 'w') as f: 
      json.dump(self.obj, f) 

    def someOtherMethod(self, s): 
     ''' do something else ''' 
     print('hello {}'.format(s)) 

import json 
with open('anObject.json','r') as f: 
    obj = json.loads(f.read()) 
# print out obj['values'] obj['someBool'] ... 
for key in obj: 
    print(key, obj[key]) 

aThing = DoStuffWithObject(obj) 
aThing.someOtherMethod('there') 

Sonra java nesneyi geri okuyun. Bu fikri hayata geçiren çözümler var (JSON-RPC, XML-RPC ve türevleri). Buna bağlı olarak, mongo'nun jsonu olduğu gibi (http://docs.mongodb.org/ecosystem/drivers/java/) bir yararı kullanmayı düşünebilirsiniz.

Bkz:

daha kapsamlı bir liste:

Kaynaklar başvurulan:

+0

Kodunuzu tekrar kontrol edin. Birkaç hata var. – Clashsoft

+0

oldukça kapsamlı teşekkürler. Yani bu JSON'u bir dosyaya yazar? Bu büyük dizilerle çalışır mı (binlerce çok boyutlu). – user1584120

+0

@Clashsoft, kodun kendisinde hata olduğunu belirtti. Genelde java programlamıyorum ve genellikle hiç demek istemiyorum. Özür. Ama evet, fikir binlerce diziyle çok kullanılabilir. Ancak, etrafta birçok nesneye dönüşmeye başlarsa, nasıl yönetildiğini düşünmek isteyebilirsiniz, dolayısıyla bağlantı kurmaya çalıştığım diğer kaynaklar. – jmunsch

0

aşağıda cevapla katılıyorum. Bence bu alt çizginin "Python ve Java'nın ayrı yorumlayıcı ortamları olduğunu düşünüyorum.""Bu nedenle, bir nesnesini nesnesini" diğerine aktarmayı beklememelisiniz. "yöntemlerini çağırmayı beklememelisiniz. "Ama seri ve başka bir program ile yapacağı gibi bazı ara veri formatında (örn JSON) aracılığıyla de-serializing tarafından, birinden diğerine VERİ geçmek makul. Bazı ortamlarda

Microsoft Windows gibi, OLE (dot-Net) 'un gibi bir teknolojinin, ortamların birbirleriyle "aktif olarak" birbirine bağlanmasına izin vermek mümkün olabilir; bu, çeşitli sistemlerin OLE-nesnelerini uygulayıp sağlar. Bunun ne yapılabileceği veya nasıl yapılabileceği ile ilgili herhangi bir kişisel deneyiminiz olsun.

Bu nedenle, yapılacak en güvenli şey t hem "kayıtlar" olarak hem de serileştirme tekniklerini her iki tarafta da kullanır. (Ya da, eğer çok maceraperest olsaydınız, Java'yı çocuk ipliğiyle çalıştırın.) “Maceracı” bir tasarım, çok az yatırım getirisiyle, çok çabuk elden çıkabilirdi.

+0

Sadece bunun nasıl çalıştığını araştırıyorum ve mümkün olup olmadığını merak ediyorum. Biraz jna gibi bir şey umuyordum ama bu uygun değil gibi görünüyor? – user1584120

+0

pyro gibi bir şey kullanmaktan ne haber? – user1584120

0

python dosyasını py2exe kullanarak exe yapmalısınız, Bkz. Bağlantı: https://www.youtube.com/watch?v=kyoGfnLm4LA. Sonra java ve pas argümanlar programı kullanın: Ben bir uygulama aynı tür yapmıştı

Calling fortran90 exe program from java is not executing

+0

evet, bunu bir işlem olarak çalıştırmak için bir seçenek olduğunu gördüm, ancak bu bir şey döndürmenize izin vermiyor – user1584120

+0

Geri dönmesine izin verecek. Java kodunuzdaki exe'den geri dönüş değerini yakalayacak ve başka şeyler için bunu kontrol edebileceksiniz !! Değerleri python kodunuza aktarabilir ve [] argv [] argümanlarını kullanabilirsiniz! – Santhucool

+0

Bunu mu demek istediniz: System.exit (0) 0 alabilirim? Tek bir tam sayı, normalde dönüşte bir dizi veya struct/class beklerdim. – user1584120

İlgili konular