Выполнить файл Python из Java с подключением к MongoDB - PullRequest
0 голосов
/ 10 сентября 2018

Это первый раз, когда я пишу вопрос на этом сайте, так что прости меня, если я ошибаюсь. Я пишу программу на Java, которая:

  • читает из файла Json некоторые параметры;
  • Выполнить файл python, передав параметры, прочитанные ранее. Я использую Eclipse P в качестве Java IDE и установил на свой компьютер версию Python 3.7.

Сценарий файла Java:

import java.io.IOException;
import java.util.Set;
import org.json.JSONArray;
import org.json.JSONObject;
import org.python.core.PyString;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;

public class MainClass {

    public static void main(String[] args) throws IOException {

        JSONArray newJsonArray = null;
        String p2 = "C:\\Users\\martina\\OneDrive\\parameter.json";
        newJsonArray = ReadJson.parseJSONFile(p2);
        JSONObject jobjt = newJsonArray.getJSONObject(0);
        Set<String> keyset = jobjt.keySet();
        String[] myArrayofKeys = keyset.toArray(new String[keyset.size()]);

        PythonInterpreter interpreter = new PythonInterpreter();
        PySystemState sys = interpreter.getSystemState();
        sys.path.append(new PyString("C:\\Program Files\\Python37\\Lib\\site-packages"));

        //setting the parameters
        for(int i=0;i<myArrayofKeys.length;i++) {
            System.out.println(myArrayofKeys[i]);
            interpreter.set(myArrayofKeys[i], 
            jobjt.getDouble(myArrayofKeys[i]));
        }
        interpreter.set("spec_id", "A00366" );

        interpreter.execfile("C:\\Users\\martina\\K1-S1.py");

        interpreter.close();

    }

}

В файле Python у меня есть некоторая формула для вычисления переменных с параметрами, которые JAva передает ему, и другими параметрами, которые Python принимает из MongoDB. Файл Python:

import pymongo
import math
import json

uri = "mongodb+srv://marts:password!@cluster0-owjhc.mongodb.net/test"
client = pymongo.MongoClient(uri)

database = client['bs']
collection = database['spec']

pi = math.pi
spec = list(collection.find({"SPEC_ID":spec_id}))[0]

#first stage

spec["TOP TREAD Lenght"]=((spec["BTDRUMdia"]+spec["TREAD PLY #1gr.ga."]*2+spec["TREAD PLY #1 FEGSgr.ga."]*4+spec["TREAD PLY #2gr.ga."]*2+spec["TREAD PLY #2 FEGSgr.ga."]*4+spec["CAP PLY / CAP STRIPgr.ga."]*2+spec["TOPTREADgr.ga. @CL"])*pi+TOPTREAD_Splice_Amount)*TOPTREAD_ApplicationStretch

print("Un risultato e': ", spec["TOP TREAD Lenght"] )

Как видите, я использую Jython для "соединения" между Java и Python, но я не знаю, является ли это лучшим решением, последнее обновление было в 2015 году.

В любом случае, в файле Java я добавил два модуля Python через PySystemState sys = interpreter.getSystemState (); , потому что при запуске он выдал ошибку ImportError: Нет модуля с именем pymongo .

Я добавляю модуль pymongo, но Ecplise выдает ошибку Для использования mongodb + srv: // URIs должен быть установлен модуль «dnspython». Затем я добавил этот модуль, найденный в Интернете, но появилась другая ошибка AttributeError: у объекта 'module' нет атрибута 'SOL_UDP' . Если я запускаю однофайловый Python с PyCharm, он соединяется с проблемами MongoDB и работает отлично.

Я не знаю, как продолжить, или я правильно добавил два модуля на Java. Кроме того, я спрашиваю, есть ли другой и лучший способ соединить Java с Python.

Я итальянец, поэтому прошу прощения за мой английский и благодарю вас за ваше время.

...