【问题标题】:Calling Python(Anaconda) Script(importing library issue) from Java从 Java 调用 Python(Anaconda)脚本(导入库问题)
【发布时间】:2019-06-26 08:29:17
【问题描述】:

我正在尝试从 java 代码中调用 python 脚本。

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 先知来做到这一点。此外,我使用了 Anaconda。所以,在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 控制台中给出预期的输出。

我看到了以前的帖子,但这些并没有解决我的问题。那些是,

Issue while calling Python(Anaconda) from Java

Calling Python script from JAVA MySQLdb imports

【问题讨论】:

  • 我猜这是环境问题。您的 Python 脚本正在使用一个具有与之关联的二进制组件 (DLL) 的模块。当您手动运行脚本时,您的环境以某种方式设置为找到该 DLL。但是Java运行脚本的环境不同,找不到DLL。您的“hello world”脚本运行良好,因为它不依赖于任何外部模块。 - 如果你在 Mac 或 Linux 上,我可以给你一些寻找的东西。但我不了解 Windows,也不知道我的想法会如何转化。
  • 是的。你是对的。我重新安装了anaconda,然后它现在工作正常。 anaconda不推荐在安装时设置path变量。
  • 太棒了!然后我会回答这个问题,以便结束这个问题。 - 我很高兴你知道了!

标签: java python anaconda


【解决方案1】:

我的猜测是这是一个环境问题。您的 Python 脚本正在使用一个具有与之关联的二进制组件 (DLL) 的模块。当您手动运行脚本时,您的环境以某种方式设置为找到该 DLL。但是Java运行脚本的环境不同,找不到DLL。您的“hello world”脚本运行良好,因为它不依赖于任何外部模块。

我建议您尝试重新安装 Anaconda。

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2018-02-08
    • 2017-06-18
    • 2014-06-25
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多