【问题标题】:Calling Python from Java (Tomcat6) as sub-process从 Java (Tomcat6) 调用 Python 作为子进程
【发布时间】:2013-07-19 22:54:30
【问题描述】:

我正在尝试从 java/tomcat6 webapp 调用 python 脚本。我目前正在使用以下代码:

           Process p = Runtime.getRuntime().exec("python <file.py>"); 
       InputStream in = p.getInputStream();
       InputStreamReader isr = new InputStreamReader(in); 
       BufferedReader b = new BufferedReader(isr);

       logger.info("PYTHON OUTPUT");


       String line = null;
       while ( (line = b.readLine()) != null){
            logger.info(line);
       }

       p.waitFor();
       logger.info("COMPLETE PYTHON OUTPUT");
       logger.info("EXIT VALUE: "+p.exitValue());

我真的看不到 python 脚本在 catalinia.out 文件中的任何输出,并且无法使用像 jython 这样的适配器库,因为该脚本依赖于几个需要 python 的 Numpy 模块才能工作的机器学习库。

帮助?

【问题讨论】:

    标签: java python bash tomcat6 jython


    【解决方案1】:

    解释可能是以下一种(或多种):

    • 命令失败并将错误消息写入其“stderr”fd ...您没有查看。

    • 命令无法启动,因为命令名称不正确;例如在$PATH 上找不到它。

    • 该命令正在尝试从其stdin fd 中读取...但您尚未提供任何输入。

    • 可能是命令行拆分的问题;例如,如果您使用带有嵌入空格的路径名,或者其他通常由 shell 处理的东西。

    此外,由于这是 python,这可能是特定于 python 的环境变量、当前目录和/或正在执行命令的有效用户的问题。


    如何进行:

    1. 确定 python 命令是否实际启动。例如。 “破解”“”以在启动时将内容写入临时文件。

    2. 改为使用ProcessBuilder 创建Process 对象。这将使您能够更好地控制流以及它们的处理方式。

    3. 找出子进程“stderr”的内容。 (ProcessBuilder 允许您将其重定向到“stdout”...)

    【讨论】:

    • 问题不是读取标准错误。感谢您的提示,很棒的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2015-05-31
    • 2015-06-01
    • 2014-10-14
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多