জাভায় পাইথন কল করছে?


116

আমি ভাবছি যে জ্যাথন ব্যবহার করে জাভা কোড থেকে পাইথন ফাংশনগুলি কল করা সম্ভব, বা এটি কেবল অজগর থেকে জাভা কোড কল করার জন্য?


3
অনুরূপ প্রশ্নটি একবার দেখুন এবং উত্তর পড়ুন। bytes.com/topic/python/answers/…
অ্যালেক্সার

উত্তর:


100

জাইথন: জাভা প্ল্যাটফর্মের জন্য পাইথন - http://www.jython.org/index.html

আপনি জাইথনের সাথে জাভা কোড থেকে অজগর ফাংশনগুলি সহজেই কল করতে পারেন। এটি যতক্ষণ না আপনার অজগর কোডটি নিজেই জাইথনের অধীনে চলে, অর্থাত্ কিছু সি-এক্সটেনশন ব্যবহার করে না যা সমর্থিত নয়।

যদি এটি আপনার পক্ষে কাজ করে তবে অবশ্যই এটি আপনি পেতে পারেন সবচেয়ে সহজ সমাধান। অন্যথায় আপনি org.python.util.PythonInterpreterনতুন জাভা 6 ইন্টারপ্রেটার সমর্থন থেকে ব্যবহার করতে পারেন ।

আমার মাথার শীর্ষ থেকে একটি সাধারণ উদাহরণ - তবে কাজ করা উচিত আশা করি: (বংশবৃদ্ধির জন্য কোনও ত্রুটি পরীক্ষা করা হয়নি)

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModules if they are not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);

আমি জেথন ইনস্টল করেছি, বা আমি ধরে নিয়েছি আমি করেছি এবং আপনি যে কোডটি উল্লেখ করেছেন তা চালানোর চেষ্টা চালিয়ে যাচ্ছি তবে এটি একটি ভুল হিসাবে হাইলাইট হয়েছে। পাইথন বা জাভা ফোল্ডারে জাইথনের কিস্তি স্থাপনের জন্য কোনও নির্দিষ্ট ফোল্ডারে যেতে হবে?
শাহাব

2
কোনও ত্রুটি নেই, জ্যাঠনকে নেটবিনে একীভূত করতে আমার খুব কষ্ট হচ্ছে
শাহাব

যদি কোনও ত্রুটি না থাকে তবে এটি কাজ করবে, সুতরাং এটি অবশ্যই স্পষ্ট নয়;) "ত্রুটি" মানে রানটাইম ত্রুটি নয়, এটি একটি সংকলন ত্রুটিও হতে পারে।
ভু

আমার খারাপ, এটি শব্দটির একটি খারাপ ব্যবহার ছিল। আমি আমার প্রকল্প এবং নেটবিনে জাইথন.জার যুক্ত করার চেষ্টা করছিলাম। যদিও আমি এটি বের করেছিলাম
শাহাব 17'12

1
পাইথন জীবনের শেষ প্রান্তটি 1.1.2020 এবং জাইথন ​​কেবল পাইথন 2.7 সমর্থন করে। সুতরাং কোনও জাইথন ​​মূলত মৃত নয়। সেরা (সর্বাধিক সহজ) বিকল্পটি হ'ল জেপ
লিবিব

62

আরে আমি ভেবেছিলাম আমি এর উত্তরটি প্রবেশ করবো যদিও দেরি হয়ে গেছে। আমি মনে করি যে জাভা এবং পাইথনের মধ্যে সংযোগ স্থাপনের আপনি কতটা দৃ strong়তার সাথে প্রথমে বিবেচনা করার জন্য কিছু গুরুত্বপূর্ণ বিষয় রয়েছে।

প্রথমত আপনি কি কেবল ফাংশনগুলিতে কল করতে চান বা আপনার জাভা অবজেক্টগুলিতে ডেথ পরিবর্তন করার জন্য আপনি আসলে পাইথন কোডটি চান? এই অত্যন্ত গুরুত্বপূর্ণ. আপনি যদি যুক্তি সহ বা ছাড়াই কিছু অজগর কোড কল করতে চান তবে এটি খুব কঠিন নয়। যদি আপনার যুক্তি আদিম হয় তবে এটিকে আরও সহজ করে তোলে। তবে আপনি যদি জাভা শ্রেণীর অজগরে সদস্য ফাংশন প্রয়োগ করতে চান যা জাভা অবজেক্টের ডেটা পরিবর্তন করে, তবে এটি এত সহজ বা সোজাভাবে এগিয়ে নয়।

দ্বিতীয়ত আমরা সিপিথন কথা বলছি বা জাইথন ​​করবে? আমি বলব সিপিথন কোথায় আছে! অজগর এত কুল কেন আমি এটাই উকিল করতাম! এ জাতীয় উচ্চ বিমূর্ততা থাকা সত্ত্বেও যখন প্রয়োজন হয় সি, সি ++ অ্যাক্সেস করে। আপনি যদি জাভাতে থাকতে পারতেন তা কল্পনা করুন। এই প্রশ্নটি জেথন ঠিক আছে কিনা তা জিজ্ঞাসা করার মতো নয় কারণ তা যাইহোক সহজ।

সুতরাং আমি নিম্নলিখিত পদ্ধতিগুলির সাথে খেলেছি এবং এগুলি সহজ থেকে কঠিন পর্যন্ত তালিকাভুক্ত করেছি:

জাভা থেকে জাইথন

সুবিধা: তুচ্ছ সহজ। জাভা বস্তুর প্রকৃত উল্লেখ রয়েছে

অসুবিধাগুলি: সিপিথন নেই, চরম ধীর!

জাভা থেকে জাইথন ​​এত সহজ, এবং যদি এটি সত্যিই যথেষ্ট হয় তবে দুর্দান্ত। তবে এটি খুব ধীর এবং কোন সিপিথন! সিপিথন ছাড়া জীবন কি মূল্যবান বলে আমি মনে করি না! আপনার কাছে জাভা অবজেক্টগুলির জন্য অজগর কোডটি আপনার সদস্য ফাংশন প্রয়োগ করতে সহজেই থাকতে পারে।

জাভা থেকে জাইথন ​​থেকে সিপিথন হয়ে পাইরো

পাইথন পাইথনের দূরবর্তী বস্তু মডিউল। সিপাইথন ইন্টারপ্রেটারে আপনার কিছু অবজেক্ট রয়েছে এবং আপনি এটিকে অবজেক্টগুলি প্রেরণ করতে পারেন যা সিরিয়ালাইজেশনের মাধ্যমে স্থানান্তরিত হয় এবং এটি এই পদ্ধতির মাধ্যমে অবজেক্টগুলিও ফিরিয়ে দিতে পারে। নোট করুন আপনি যদি জাইথন ​​থেকে সিরিয়ালযুক্ত পাইথন অবজেক্টটি প্রেরণ করেন এবং তারপরে কিছু ফাংশন কল করেন যা এর সদস্যদের ডেটা পরিবর্তন করে, তবে আপনি জাভাতে এই পরিবর্তনগুলি দেখতে পাবেন না। আপনি কেবল পাইরো থেকে যে ডেটা চান তা ফেরত পাঠাতে আপনার মনে রাখা দরকার। এটি আমার বিশ্বাস সিপিথনে যাওয়ার সহজতম উপায়! আপনার কোনও জেনি, জেনা বা সুইগ বা .... দরকার নেই আপনার কোনও সি, বা সি ++ জানা দরকার। কুল হাহ?

সুবিধা: সিপিথনে অ্যাক্সেস, নিম্নলিখিত পদ্ধতির মতো কঠিন নয়

অসুবিধা: সরাসরি অজগর থেকে জাভা অবজেক্টের সদস্য ডেটা পরিবর্তন করা যায় না। কিছুটা পরোক্ষ, (জ্যাথন মাঝারি মানুষ)।

জাভা থেকে সি / সি ++ জেএনআই / জেএনএ / এসডাব্লুআইজি হয়ে পাইথন থেকে এম্বেডড ইন্টারপ্রেটারের মাধ্যমে (সম্ভবত বুস্ট লাইব্রেরি ব্যবহার করছেন?)

ওএমজি এই পদ্ধতিটি হৃদয়ের হতাশার জন্য নয়। এবং আমি আপনাকে বলতে পারি এটি একটি শালীন পদ্ধতিতে এটি অর্জন করতে আমাকে অনেক দীর্ঘ সময় নিয়েছে। আপনি এটি করতে চান তার মূল কারণটি হ'ল আপনি সিপিথন কোডটি চালাতে পারেন যা আপনাকে জাভা অবজেক্টের উপর পুরোপুরি লাগাম দেয়। অজগর (যা ঘোড়ার মতো) এর সাথে রুটি জাভা (যা একটি চিম্পের মতো) চেষ্টা করার সিদ্ধান্ত নেওয়ার আগে আরও বড় বড় বিষয়গুলি বিবেচনা করা উচিত। প্রথমত আপনি যদি দোভাষীটিকে ক্রাশ করেন যা আপনার প্রোগ্রামটির জন্য আলোকসজ্জা করে! এবং সমঝোতা বিষয়গুলিতে আমাকে আরম্ভ করবেন না! এছাড়াও, বয়লার বরাদ্দ আছে, আমি বিশ্বাস করি যে এই বয়লারটি হ্রাস করার জন্য আমি সেরা কনফিগারেশনটি খুঁজে পেয়েছি তবে এখনও এটি বরাদ্দ! সুতরাং কীভাবে এটি যায়: বিবেচনা করুন যে সি ++ আপনার মাঝারি মানুষ, আপনার বস্তুগুলি আসলে সি ++ অবজেক্ট! ভাল যে আপনি এখন জানেন যে। কেবল আপনার অবজেক্টটি লিখুন যেমন আপনার প্রোগ্রামটি জাভা নয়, সিপিপিতে রয়েছে, উভয় পৃথিবী থেকে আপনি যে ডেটা অ্যাক্সেস করতে চান তা দিয়ে। তারপরে আপনি সুইগ নামক মোড়ক জেনারেটরটি ব্যবহার করতে পারেন (http://www.swig.org/Doc1.3/Java.html ) এটি জাভাতে অ্যাক্সেসযোগ্য করে তুলুন এবং একটি জাভা তৈরি করুন যা আপনি জাভাতে সিস্টেম.লোড (dll নাম এখানে) কল করেন comp প্রথমে এটি কাজ করুন, তারপরে শক্ত অংশে যান! অজগর পেতে আপনাকে একটি দোভাষীকে এম্বেড করতে হবে। প্রথমে আমি কিছু হ্যালো ইন্টারপ্রেটার প্রোগ্রাম বা সি / সি তে এই টিউটোরিয়াল এম্বেডিং পাইথন করার পরামর্শ দিই । আপনার যদি সেই কাজটি হয়ে যায় তবে ঘোড়া এবং বানরকে নাচানোর সময়! আপনি [বুস্ট] [3] এর মাধ্যমে আপনাকে সি ++ অবজেক্টটি পাইথনের কাছে পাঠাতে পারেন। আমি জানি আমি আপনাকে মাছটি দিই নি, কেবল আপনাকে কোথায় কোথায় মাছের সন্ধান করতে হবে তা বলেছি। সংকলন করার সময় এটির জন্য কয়েকটি পয়েন্টার লক্ষ্য করুন।

আপনি যখন বুস্ট সংকলন করেন তখন আপনাকে একটি ভাগ করা লাইব্রেরি সংকলন করতে হবে। এবং আপনাকে জেডিকে, যেমন জাওট.লিব, জেভিএম.লিব থেকে প্রয়োজনীয় জিনিসগুলি অন্তর্ভুক্ত করতে এবং লিঙ্ক করতে হবে (অ্যাপ্লিকেশনটি চালু করার সময় আপনার পথে ক্লায়েন্ট jvm.dll প্রয়োজন হবে) পাশাপাশি পাইথন 27.lib বা যাইহোক এবং boost_python-vc100-mt-1_55.lib। তারপরে পাইথন অন্তর্ভুক্ত করুন / অন্তর্ভুক্ত করুন, জেডি কে / অন্তর্ভুক্ত করুন, উত্সাহ দিন এবং কেবলমাত্র ভাগ করা লাইব্রেরি (ডেলস) ব্যবহার করুন অন্যথায় বুস্টের টিয়ার রয়েছে। এবং হ্যাঁ পূর্ণ আমি জানি। এমন অনেকগুলি উপায় রয়েছে যাতে এটি টক হয়ে যেতে পারে। সুতরাং নিশ্চিত হয়ে নিন যে আপনি প্রতিটি কাজ ব্লক করে ব্লক করে পেয়েছেন। তারপরে এগুলি একসাথে রাখুন।


2
এখানে এমন একটি লাইব্রেরি যা আপনাকে একবার অজগর স্ক্রিপ্ট লিখতে দেয় এবং সিদ্ধান্ত নিতে পারে কোনটি ইন্টিগ্রেশন পদ্ধতি (জ্যাথন, সিপাইথন জ্যাপ এবং পাই 4 জে) রানটাইমে ব্যবহার করতে হবে: github.com/subes/invesdwin-context-python যেহেতু প্রতিটি পদ্ধতির নিজস্ব সুবিধা / ত্রুটি রয়েছে
সাবেস

@ সাউবগুলি যে প্রকল্পটি দুর্দান্ত দেখায় আমি কিছুক্ষণ আগে এটি লিখেছিলাম। আমি আপনাকে উত্তর লিখতে উত্সাহিত করছি আমি এটি upvote হবে। আমি উপরের উত্তরটি হাহাকে অপছন্দ করি কারণ আমার মনে হয় না এটি কোনও গুগল অনুসন্ধানের বাইরে খুব বেশি দরকারী তথ্য সরবরাহ করে।
Snickers3192

আমি একটি পৃথক উত্তর তৈরি করেছি
সাবস

3
এই উত্তরটির গন্ধ কি "এটি গ্রহণযোগ্য উত্তর হওয়া উচিত" বা এটি কেবল আমার? ;-)
মৌরিসিও গ্রাসিয়া গুটিরেজ

18

জাভাতে অজগর কোড রাখা স্মার্ট নয়। এটিকে একটি মাইক্রোসার্চ হিসাবে তৈরি করতে আপনার অজগর কোডটি ফ্লাস্ক বা অন্যান্য ওয়েব ফ্রেমওয়ার্কের সাথে মুড়িয়ে দিন। আপনার জাভা প্রোগ্রামটিকে এই মাইক্রোসার্চিসে কল করতে সক্ষম করুন (যেমন, REST এর মাধ্যমে)।

আমাকে ক্ষমা করুন, এটি অনেক সহজ এবং আপনার অনেকগুলি সমস্যা বাঁচাবে। কোডগুলি আলগাভাবে সংযুক্ত করা হয় যাতে তারা স্কেলযোগ্য।

24 শে মার্চ 2020 এ আপডেট হয়েছে: @ স্টেক্সের মন্তব্য অনুসারে, ক্লায়েন্ট এবং সার্ভারের মধ্যে বৃহত্তর ডেটা স্থানান্তরের জন্য উপরের পদ্ধতির পক্ষে উপযুক্ত নয়। এখানে আমি প্রস্তাবিত আরেকটি পদ্ধতির জন্য রয়েছে: মজাদার (সি / সি ++ এছাড়াও ঠিক আছে) এর সাথে পাইথন এবং জাভা সংযুক্ত করা। https://medium.com/@shmulikamar/https-medium-com-shmulikamar-connecting-python-and-java-with-rust-11c256a1dfb0


+1, তবে উভয় প্রান্তে বার্তা এবং বার্তা তৈরি এবং পার্সিংয়ের অতিরিক্ত কর্মক্ষমতা এবং যোগাযোগ ওভারহেড সম্পর্কে কী?
stx

হ্যাঁ, এটিতে সর্বনিম্ন ইনপুট / আউটপুট প্রয়োজনীয় একটি এপিআই ইন্টারফেসটি সংজ্ঞায়িত করা দরকার। নেটওয়ার্কে ক্লায়েন্ট / সার্ভারের মধ্যে প্রচুর ডেটা ট্রান্সফার থাকা স্মার্ট নয়। আপনি যদি এই ধরনের ইন্টারফেস সংজ্ঞায়িত করতে না পারেন তবে এই নকশার পদ্ধতির স্যুট হয় না।
হু

10

বেশ কয়েকটি উত্তরে উল্লেখ করা হয়েছে যে আপনি সিপিথন অ্যাক্সেস করতে জেএনআই বা জেএনএ ব্যবহার করতে পারেন তবে আমি স্ক্র্যাচ থেকে শুরু করার পরামর্শ দেব না কারণ জাভা থেকে সিপিথন অ্যাক্সেস করার জন্য ইতিমধ্যে ওপেন সোর্স লাইব্রেরি রয়েছে। উদাহরণ স্বরূপ:


8

এখানে এমন একটি লাইব্রেরি যা আপনাকে একবার আপনার অজগর স্ক্রিপ্ট লিখতে দেয় এবং সিদ্ধান্ত নিতে পারে কোনটি ইন্টিগ্রেশন পদ্ধতি (জাইথন, সিপাইথন / পাইপাই জেপ এবং পাই 4 জনের মাধ্যমে) রানটাইম ব্যবহার করতে হবে:

https://github.com/subes/invesdwin-context-python

যেহেতু লিঙ্কে বর্ণিত প্রতিটি পদ্ধতির নিজস্ব উপকারিতা / ত্রুটি রয়েছে।


এই প্রকল্পের কোনও মুক্তি নেই।
ক্রিশ্চান স্লিচথেরেল

@ ক্রিশ্চিয়ানস্লিচথেরেল ইনভেস্টউইন-কনটেক্সট-পাইথনের সংস্করণ 1.0.0 উপলভ্য নয়; এই ছোট মণির জন্য ধন্যবাদ: github.com/loewenfels/dep-
راف-

6

এটি অজগর ফাংশন বলতে কী বোঝায় তার উপর নির্ভর করে? যদি তারা লেখা cpython আপনি সরাসরি তাদের কল করতে পারেন না আপনি ব্যবহার করতে হবে JNI , কিন্তু যদি তারা লেখা হয়েছে Jython আপনি সহজেই জাভা থেকে তাদের কল করতে পারেন যেমন jython পরিণামে জাভা বাইট কোড জেনারেট করে।

এখন আমি যখন সিপাইথন বা জাইথনে লিখিত বলি তখন এটি বেশি অর্থবোধ করে না কারণ পাইথন পাইথন এবং বেশিরভাগ কোড উভয় বাস্তবায়নের ক্ষেত্রে চালিত হয় যদি না আপনি নির্দিষ্ট লাইব্রেরি ব্যবহার করেন যা সিপাইথন বা জাভা নির্ভর করে।

জাভাতে পাইথন ইন্টারপ্রেটার কীভাবে ব্যবহার করবেন তা এখানে দেখুন


5

আপনার প্রয়োজনীয়তার উপর নির্ভর করে, এক্সএমএল-আরপিসির মতো বিকল্পগুলি কার্যকর হতে পারে, যা প্রোটোকল সমর্থনকারী কোনও ভাষায় কার্যত কার্যত কল করতে ব্যবহৃত হতে পারে।


5

GraalVM একটি ভাল পছন্দ। মাইক্রোসারওয়াইস ডিজাইনের জন্য জাভা + জাভাস্ক্রিপ্ট সংমিশ্রণটি করেছি (জাভাস্ক্রিপ্ট প্রতিবিম্ব সহ জাভা)। তারা সম্প্রতি অজগরটির জন্য সমর্থন যোগ করেছে, আমি এটি চেষ্টা করেছিলাম বিশেষত কয়েক বছর ধরে এর সম্প্রদায় কতটা বড় হয়েছে it


4

আপনি জাভা নেটিভ ইন্টারফেস ব্যবহার করে জাভা থেকে যে কোনও ভাষা কল করতে পারেন


6
যে ভাষাটি নিজেই সি থেকে ডেকে আনা যায়। আচ্ছা ঠিক আছে পাইথন পারে, তবে জ্যাথন হ'ল সত্যিই একটি সহজ সমাধান (বা জে 6 + তে পাইআইনটারপ্রেটার ব্যবহার করে)। সি থেকে পাইথন ফাংশন কল করতে কোড লিখতে এটি তুচ্ছ নয়।
ভু

2

জাইথনের কিছু সীমাবদ্ধতা রয়েছে:

বিভিন্ন মতভেদ আছে। প্রথমত, জাইথন ​​প্রোগ্রামগুলি সিটিতে লেখা সিপিথন এক্সটেনশন মডিউলগুলি ব্যবহার করতে পারে না mod আপনি যদি এই জাতীয় কোনও মডিউল ব্যবহার করতে চান তবে আপনার খাঁটি পাইথন বা জাভাতে লেখা সমমানের সন্ধান করা উচিত। যদিও এই জাতীয় এক্সটেনশানগুলিকে সমর্থন করা প্রযুক্তিগতভাবে সম্ভব - IronPython এটি করে - জাইথনে এটি করার কোনও পরিকল্পনা নেই।

জাইথনের সাথে আমার পাইথন স্ক্রিপ্টগুলি জেআর ফাইল হিসাবে বিতরণ করা হচ্ছে?

আপনি রানটাইম বা প্রসেসবিল্ডার ব্যবহার করে জাভা থেকে কেবল পাইথন স্ক্রিপ্টগুলি (বা বাশ বা পার্ল স্ক্রিপ্ট) কল করতে পারেন এবং আউটপুট জাভায় পাস করতে পারেন:

জাভাতে বাশ শেল স্ক্রিপ্ট চালাচ্ছি

জাভাতে কমান্ড লাইন চলছে

জাভা রানটাইম.জেটরুনটাইম () একটি কমান্ড লাইন প্রোগ্রাম কার্যকর করে আউটপুট পাচ্ছে


0

এটি বর্তমান বিকল্পগুলির উপর একটি দুর্দান্ত উত্সাহ দেয়। যার কয়েকটি অন্যান্য উত্তরে নাম দেওয়া হয়েছে। জাইথন ​​ব্যবহারযোগ্য নয় যতক্ষণ না তারা পাইথন ৩.x বাস্তবায়ন করার সিদ্ধান্ত নেয় এবং অন্যান্য প্রকল্পের অনেকগুলি পাইথন পার্শ্বে আসে এবং জাভা অ্যাক্সেস করতে চায় না। তবে এখনও এমন কিছু অপশন রয়েছে যার নাম নামকরণ করা হয়নি: জিআরপিসি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.