我在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')
最佳答案
请在网络应用程序或任何托管环境中的普通线程上使用并发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) )
您可以简单地将输出重定向到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
}