繁体   English   中英

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

[英]Run python script in servlet via tomcat not working

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

    }
}

我看到的 output 是 - 你好(在 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')

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

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

简单地尝试调用python作为绝对路径,假设python位于/usr/bin/ ,所以 go 用于/usr/bin/python而不是python

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

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

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

您可以简单地将 output 重定向到nul或一个文件而不是 parent(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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM