【问题标题】:Run python script in servlet via tomcat not working通过tomcat在servlet中运行python脚本不起作用
【发布时间】:2020-09-02 15:03:46
【问题描述】:

我在 tomcat9 中创建了一个 servlet 并对其进行了 ajax 调用,但 python 脚本不会被执行。

我的代码:

package com.thinking.machines.myServices.servlet;

import com.thinking.machines.myServices.database.*;
import com.thinking.machines.myServices.pojo.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.google.gson.*;
import java.io.*;

public class HtmlToPdfServlet extends HttpServlet {
    static String filepath = "..\\..\\..\\..\\..\\..\\cgi\\html_to_pdf.py";

    public static void generatePDF(String link) {

        System.out.println("hello hi");
        new Thread(() -> {
            try {
                ProcessBuilder pb = new ProcessBuilder("python",filepath,link);
                Process p = pb.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        String link = request.getParameter("data");
        generatePDF(link);
        System.out.println(link);

    }
}

我看到的输出是 - hello hi(在 tomcat 服务器中),但没有执行 python 脚本。 我还配置了tomcat的conf/web.xml文件。

但是当我只是简单地在没有 servlet 的情况下使用它并在命令行中使用它时,它对我来说很好。

这里是python代码:

import sys
import pdfkit
arg=sys.argv[1]
print(arg)
pdfkit.from_url(arg,'..\\result\\google.pdf')

【问题讨论】:

    标签: java python servlets tomcat9 html-to-pdf


    【解决方案1】:

    请在 webapps 或任何托管环境中使用并发 API 而非普通线程。或者更好的是,在 tomcat/webapp 上下文中指定一个执行器,然后使用它。

    关于这个问题,你有没有得到任何具体的错误(如果有,请提供堆栈跟踪)?确保python 在tomcat 的路径中可见。因为你可以从 cmd/terminal 运行python,这并不意味着 tomcat 可以做同样的事情。

    只需尝试将python 称为绝对路径,假设python 位于/usr/bin/,因此请使用/usr/bin/python 而不是python

    另一个可能的问题是子进程阻塞 IO(由于缓冲区有限)。

    您创建的每个进程(如Process p = pb.start();)都有两个流,一个用于输入,一个用于输出。

    现在,如果python 打印了一些东西(即 java 端的 inputstream),并且没有读取 inputstream,那么进程将被冻结(并非总是如此),直到流缓冲区在另一端释放(java在你的情况下)

    您可以简单地将输出重定向到nul,或者一个文件而不是父(java)调用者,然后看看会发生什么。 例如

    Process p = pb.start();
    InputStream _is=_p.getInputStream();
    int _r;
    while((_r=_is.read())!=-1){//keeps the buffer free always
         //use or ignore it
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2015-07-15
      相关资源
      最近更新 更多