1

hgweb.cgi を実行したい Jetty Web サーバーがあります。

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

コマンドラインからも機能しません。hgweb.cgi の形成されたリクエストにヘッダー (SCRIPT_NAME, "") を追加しようとしましたが、引き続きそのメッセージが表示されます。

hgweb を使用するすべての例で、人々はapache / lighttpd / nginxサーバーを使用して hgweb.cgi を実行してますが、なぜ nodody が自分のやりたいことを実行したのか理解できません。

誰かがhgweb.cgiの設定を手伝ってくれたり、Java から.cgiスクリプトを呼び出す適切な方法を教えてくれたりしたら、本当に嬉しいです!

4

2 に答える 2

1

例が見つからない理由は、リクエストごとに Java から Python 実行可能ファイルを呼び出すことは、誰もが推奨するものではないからだと思います。遅くて安全ではありません。単一の Python プロセスを再利用し、まさにこの種のもののために設計されたCommand Serverとパイプを介して通信することを検討してください。Java クライアント ライブラリもあります。

本当に mercurial を Java とは別のプロセスとして呼び出したい場合は、.cgi (または取得しているように見える wsgi) を呼び出す必要はありません。コマンドライン引数と stdin を指定して、メインの Python 実行可能ファイルを直接呼び出すだけです。

于 2015-08-12T17:21:52.750 に答える
0

Java から cgi を呼び出すには、hgweb.cgi を呼び出す必要はありません (もう 1 つわかったことがあります。.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 に答える