我有Jetty Web服务器,我想从中运行hgweb.cgi:
ProcessBuilder builder = new ProcessBuilder("/MyPath/hgweb.cgi");
然后我创建Process process = builder.start();
并将请求的输入流提供给进程形成服务器响应。但是有一个问题:我无法理解的某种python错误
File "<stdin>", line 1, in <module>
File "mercurial/hgweb/wsgicgi.py", line 76, in launch
content = application(environ, start_response)
File "mercurial/hgweb/hgweb_mod.py", line 168, in __call__
return self.run_wsgi(req)
File "mercurial/hgweb/hgweb_mod.py", line 177, in run_wsgi
req.url = req.env['SCRIPT_NAME']
KeyError: 'SCRIPT_NAME
这在命令行中也不起作用。我尝试添加标题(SCRIPT_NAME,“”)以形成对hgweb.cgi的请求,但继续看到该消息。
在每个使用hgweb的例子中,人们使用 apache / lighttpd / nginx 服务器来运行 hgweb.cgi ,我无法理解为什么nodody会做我想做的事情
如果有人可以帮我配置 hgweb.cgi 或告诉我从java调用 .cgi 脚本的正确方法,我会非常高兴的!
答案 0 :(得分:1)
我认为你找不到任何例子的原因是从每个请求调用Java的python可执行文件并不是任何人都推荐的。这是缓慢而不安全的。考虑通过管道与Command Server进行通信,该管道重用单个python进程,并且专门针对这类事情而设计。甚至还有Java客户端库。
如果你真的想尝试将mercurial作为一个独立的进程从java调用,你不需要调用.cgi(或wsgi,它看起来像你得到的)。只需直接调用主python可执行文件,提供命令行参数和stdin。
答案 1 :(得分:0)
要从java调用cgi,你不需要调用hgweb.cgi(还有一件事我想通了:.cgi只不过是一个告诉你程序目的的标志。没有特殊的语言对于cgi或函数签名,你必须照顾)。我制作了一个脚本hgweb.py
:
import os
from mercurial import demandimport
from mercurial.hgweb import hgweb, wsgicgi
repositoryPath = os.environ['REPOSITORY_PATH']
application = hgweb(repositoryPath)
wsgicgi.launch(application)
几行代码调用该脚本:
ProcessBuilder process = new ProcessBuilder("python", "hgweb.py");
//pass all necessary environment variables
Map<String, String> env = process.environment();
env.put("variable", "value");
..
//then pick a directory where your process will run
process.directory(yourDirectory);
process.start();
/* then set up
* inputStream from request
* outputStream for response
* errorStream that is very useful if something went wrong
* (you may forget to add an environment variable or something like that)
*/
我认为这正是我所需要的。如果我发现任何问题 - 我会在这里写下来。 感谢Ry4an提供帮助。