[英]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.