通过tomcat在servlet中运行python脚本不起作用

问题描述 投票:0回答:1

我在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);

    }
}

我看到的输出是-您好(在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个回答
0
投票

请在Webapp或任何托管环境中的纯线程上使用并发API。或者更好,在tomcat / webapp上下文中指定执行程序,然后使用它。

关于此问题,您是否遇到任何特定的错误(请提供stacktrace(如果有))?确保python在tomcat的路径中可见。因为您可以从cmd / terminal运行python,但这并不意味着tomcat可以执行相同的操作。

[简单地尝试将python称为绝对路径,所以说python位于/usr/bin/,因此选择/usr/bin/python而不是python

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

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

现在,如果python打印某些内容(在Java端为inputstream,并且没有读取inputstream,则进程将冻结(并非总是如此),直到流缓冲区被另一方释放为止(java in您的情况)

您可以简单地将输出重定向到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
}
© www.soinside.com 2019 - 2024. All rights reserved.