1

我有 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脚本的正确方法,我将非常高兴!

4

2 回答 2

1

我认为您找不到任何示例的原因是从 Java 为每个请求调用 Python 可执行文件并不是任何人都推荐的。它缓慢且不安全。考虑通过管道与命令服务器进行通信,该命令服务器重用单个 Python 进程并且专为此类事情而设计。甚至还有 Java 客户端库。

如果您真的想尝试将 mercurial 作为独立于 Java 的进程调用,则无需调用 .cgi(或看起来像您所获得的 wsgi)。只需直接调用主要的 Python 可执行文件,提供命令行参数和标准输入。

于 2015-08-12T17:21:52.750 回答
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的帮助。

于 2015-08-17T21:48:47.797 回答