Вызов скрипта Python (Anaconda) (проблема с импортом библиотеки) из Java - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь вызвать скрипт Python из кода Java.

public class PythonTest {
    public static void main(String[] args) throws IOException, ScriptException, InterruptedException {
        ProcessBuilder pb = new ProcessBuilder().inheritIO().command("C:/Users/emon/Anaconda3/python.exe",
                "forecast.py");
        Process process = pb.start();
        process.waitFor();
        InputStream inputStream = process.getInputStream();

        int i = 0;
        StringBuilder stringBuffer = new StringBuilder();
        while ((i = inputStream.read()) != -1) {
            stringBuffer.append((char) i);
        }
        System.out.println(stringBuffer.toString());
      }
}

По сути, я использовал скрипт Python для прогнозирования некоторых данных временного ряда.Я использовал пророка Facebook, чтобы сделать это.Кроме того, я использовал Анаконду.Итак, в скобках command я использовал C:/Users/emon/Anaconda3/python.exe.

from fbprophet import Prophet
import numpy as np
import pandas as pd
# import matplotlib.pyplot as plt

# plt.rcParams['figure.figsize'] = (20, 10)
# plt.style.use('ggplot')

sales_df = pd.read_csv('multiTimeline.csv')
sales_df['y_orig'] = sales_df['y']
sales_df['y'] = np.log(sales_df['y'])
model = Prophet()
model.fit(sales_df)
future_data = model.make_future_dataframe(periods=50, freq='w')
forecast_data = model.predict(future_data)
forecast_data[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
model.plot(forecast_data)
print(forecast_data)

# for index, row in forecast_data.iterrows():
#     print(
#         str(index) + " " + str(row['ds']) + " " + str(np.exp(row['yhat'])) + " " + str(
#             np.exp(row['yhat_lower'])) + " " + str(np.exp(row['yhat_upper'])))

# plt.show()

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

Traceback (most recent call last):
  File "google-trends-service/src/main/java/com/emon/forecast.py", line 1, in <module>
    from fbprophet import Prophet
  File "C:\Users\emon\Anaconda3\lib\site-packages\fbprophet\__init__.py", line 8, in <module>
    from fbprophet.forecaster import Prophet
  File "C:\Users\emon\Anaconda3\lib\site-packages\fbprophet\forecaster.py", line 15, in <module>
    import numpy as np
  File "C:\Users\emon\Anaconda3\lib\site-packages\numpy\__init__.py", line 140, in <module>
    from . import _distributor_init
  File "C:\Users\emon\Anaconda3\lib\site-packages\numpy\_distributor_init.py", line 34, in <module>
    from. import _mklinit
ImportError: DLL load failed: The specified module could not be found.

Но если я заменю свой скрипт на Python только

print("Hello world")

Это даст ожидаемый результат в консоли Java.

Я видел предыдущие посты, но они не решили мою проблему.

Ошибка при вызове Python (Anaconda) из Java

Вызов сценария Python из JAVA MySQLdb import

1 Ответ

0 голосов
/ 26 июня 2019

Я предполагаю, что это проблема окружающей среды.Ваш скрипт Python использует модуль, с которым связан двоичный компонент (DLL).Когда вы запускаете скрипт вручную, ваша среда каким-то образом настраивается на поиск этой DLL.Но среда, в которой работает Java-скрипт, отличается, и DLL не может быть найдена.Ваш скрипт "hello world" работает нормально, потому что он не зависит от каких-либо внешних модулей.

Я бы посоветовал вам попробовать переустановить Anaconda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...