从 Java 执行 hgweb.cgi
Execute hgweb.cgi from Java
我有 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
命令行也行不通。我试图添加 header (SCRIPT_NAME, "") 以形成对 hgweb.cgi 的请求,但继续看到该消息。
在每个使用 hgweb 的例子中,人们使用 apache / lighttpd / nginx 服务器到 运行 hgweb.cgi我不明白为什么nodody做了我想做的事。
如果有人可以帮助我配置 hgweb.cgi 或告诉我从 .cgi 脚本调用 .cgi 的正确方法=38=]我会很高兴的!
我认为您找不到任何示例的原因是,对于每个请求从 Java 调用 Python 可执行文件并不是任何人真正推荐的做法。它缓慢且不安全。考虑通过管道与 Command Server 进行通信,它重用单个 Python 进程并且专为此类事情而设计。甚至还有 Java 个客户端库。
如果你真的想尝试将 mercurial 作为一个单独的进程从 Java 中调用,你不需要调用 .cgi(或你看起来像的 wsgi)。只需直接调用主要 Python 可执行文件,提供命令行参数和标准输入。
要从 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 的帮助。
我有 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
命令行也行不通。我试图添加 header (SCRIPT_NAME, "") 以形成对 hgweb.cgi 的请求,但继续看到该消息。
在每个使用 hgweb 的例子中,人们使用 apache / lighttpd / nginx 服务器到 运行 hgweb.cgi我不明白为什么nodody做了我想做的事。
如果有人可以帮助我配置 hgweb.cgi 或告诉我从 .cgi 脚本调用 .cgi 的正确方法=38=]我会很高兴的!
我认为您找不到任何示例的原因是,对于每个请求从 Java 调用 Python 可执行文件并不是任何人真正推荐的做法。它缓慢且不安全。考虑通过管道与 Command Server 进行通信,它重用单个 Python 进程并且专为此类事情而设计。甚至还有 Java 个客户端库。
如果你真的想尝试将 mercurial 作为一个单独的进程从 Java 中调用,你不需要调用 .cgi(或你看起来像的 wsgi)。只需直接调用主要 Python 可执行文件,提供命令行参数和标准输入。
要从 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 的帮助。