java - مصر - كيفية استدعاء الكائنات جافا وظائف من كبيثون؟




وظائف مبرمجين (4)

لدي برنامج الثعبان، الذي يعمل على تنفيذ كبيثون، وداخله لا بد لي من استدعاء وظيفة محددة في برنامج جافا. كيف يمكنني أن أفعل هذا؟

سيكون من الجميل أن تكون قادرة على استخدام بعض الكائنات جافا أيضا.

جيثون ليس خيارا. يجب تشغيل جزء الثعبان في كبيثون.


أسهل شيء يجب القيام به هو

  1. كتابة كلي كليفي الخاص بك جافا "وظيفة". (لا يوجد شيء من هذا القبيل، لذلك سأفترض أنك تعني في الواقع وظيفة طريقة من فئة جافا.)

    public class ExposeAMethod {
        public static void main( String args[] ) {
             TheClassToExpose  x = new TheClassToExpose();
            x.theFunction();
        }
    }
  2. تجميع وبناء ملف جار قابل للتنفيذ مع هذا كنقطة دخول. ExposeAMethod.jar

  3. استدعاء هذا من أمر تم إنشاؤه بواسطة سوبروسيس.

    import subprocess
    p = subprocess.Popen("java -jar ExposeAMethod.jar", shell=True)
    sts = os.waitpid(p.pid, 0)

هذا هو الحد الأدنى. وانها حقا ليست كثيرا. أنا عد 6 خطوط من جافا، 3 خطوط من بيثون وكنت وتشغيلها.

إذا كنت ترغب في تمرير الوسيطات إلى هذا منشئ فئة جافا أو وظيفة الأسلوب، سيكون لديك لكتابة بضعة أسطر أخرى من التعليمات البرمجية. لديك خياران.

  • قراءة الحجج من ستدين، وكتابة النتائج على ستدوت. هذا أمر سهل نسبيا ويؤدي بشكل جيد حقا.

  • تحليل الوسيطات كخيارات سطر الأوامر إلى جافا، كتابة النتائج على ستدوت. هذا هو أصعب قليلا، ولكن تعميم بشكل جيد جدا. المكافأة هي أن لديك الآن برنامج جافا سطر الأوامر المفيدة التي يمكنك إعادة استخدامها.


أنا لا أعرف لبيثون، بيت آخر مرة اضطررت إلى استدعاء جافا من C تطبيق (خدمة نت) كان لي لتحميل jvm.dll. نلقي نظرة على وثائق جني.

أيضا، استدعاء دائما استدعاء os.system ("جافا com.myapp.MyClass") إذا كنت لا تشعر بالقلق إزاء الأداء.


اعتذارات لإحياء الموضوع، ولكن أعتقد أن لدي إجابة أفضل :-)

يمكنك أيضا استخدام Py4J التي تحتوي على جزأين: مكتبة يتم تشغيلها في كبيثون (أو أي مترجم بايثون لهذه المسألة) ومكتبة تعمل على جافا فم تريد الاتصال بها.

هناك مثال على الصفحة الأولى والكثير من الوثائق، ولكن في الأساس، يمكنك فقط استدعاء أساليب جافا من رمز الثعبان الخاص بك كما لو كانت أساليب الثعبان:

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

يتم الاتصال من خلال مآخذ بدلا من جني.

تنويه: أنا مؤلف Py4J


نظرة على مشروعنا بيثون جافابريدج . انها المجمع بيثون حول جني، تستخدم بشكل كبير من قبل سيلبروفيلر . ويوفر كل من الوصول على مستوى منخفض إلى جني والوصول إلى انعكاس رفيع المستوى على أساس الكائنات جافا.







language-interoperability