我有Jetty服务器,我想从它运行hgweb.cgi:
ProcessBuilder builder = new ProcessBuilder("/MyPath/hgweb.cgi");然后创建从请求到进程形成服务器响应的Process process = builder.start();和提要输入流。但是有一个问题:某种我无法理解的蟒蛇错误
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脚本的正确方法,我会非常高兴的!
发布于 2015-08-12 17:21:52
我认为您找不到任何例子的原因是,对于每个请求,从Java调用Python可执行文件并不是真正的建议。又慢又不安全。考虑通过管道与命令服务器进行通信,后者重用单个process,并且正是为此目的而设计的。甚至还有Java客户端库。
如果您真的想尝试将mercurial作为一个独立于Java的进程调用,则不需要调用.cgi (或者wsgi,它看起来像您所得到的那样)。只需直接调用主Python可执行文件,提供命令行参数和stdin。
发布于 2015-08-17 21:48:47
要从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的帮助。
https://stackoverflow.com/questions/31968653
复制相似问题