1

私は現在、Java プログラムを実行してから別のページにリダイレクトするという最終目標を持つ CGI スクリプトを作成しています。ただし、Java プログラムを実行しようとすると、CGI によって 500 内部サーバー エラーが発生します。os.system("[command]") と call(["command"]) と subprocess.Popen("command") を試しましたが、3 つすべてで同じ問題が発生します。どんな提案でも大歓迎です。

編集また、apache ログには、無効なヘッダーがあるという情報しかありません。

編集

#!/usr/bin/python

# Import the CGI module
import cgi
import random
import os
import sys
import re
import subprocess

# Required header that tells the browser how to render the HTML.
print "Content-Type: text/html\n\n"

form = cgi.FieldStorage()
userID = random.random()
print "<html>"
print "<title>Results</title>"
print "<body>"

command = "java [classname] "
user_id = random.randint(0, sys.maxint)
command += str(user_id) + " "
command +=  re.sub(r'\s', '', form['key0'].value) + " "
command += form['key1'].value + " "
command += form['key2'].value + " "
command += form['key3'].value + " " if form.has_key('key3') else "0 "

## This is where the problem exists
#os.system("ls -l")
#call(["ls", "-l"])
#p = subprocess.Popen(command)
## End of Problem

print command   
print "<br>"
print "Redirecting..."

print "<meta http-equiv='refresh' content='0;url=",
print "http://192.168.1.41/Path/",
print user_id,
print ".html' />" 


print "</body>"
print "</html>"

コマンド全体はありませんが、印刷されたコマンドをコピーしてターミナルで実行でき、完全に実行されるため、正しく構築されていると思います。コマンドは単純に java [classname] [9 args] です。

Java コードは Python コードの外でスムーズに実行され、.png ファイルと .png を含む .html ファイルを生成するだけです。ファイルの名前は [user_id].html であるため、リダイレクトされます。

プロセス コマンドのみがコメント アウトされている場合、内部サーバー エラーは発生しません。

EDITこのスクリプトを実行するためにあきらめてphpに移動することになりました。助けてくれてありがとう!

4

2 に答える 2

1

やってみました:

import cgitb

cgitb.enable()

より意味のあるエラーを取得するには-ブラウザのPythonエラーメッセージ

また

サーバーのコマンドラインからスクリプトを実行して、Pythonがエラーを返しているかどうかを確認し、エラーが返されている場合は、問題の診断に役立つかどうかを確認します。

また

Java呼び出しをPythonスクリプトからのHTML出力として出力しますか?

于 2011-03-28T09:04:42.230 に答える
1
## This is where the problem exists
#os.system("ls -l")
#call(["ls", "-l"])
#p = subprocess.Popen(command)
## End of Problem
  1. に焦点を当てsubprocess.Popenます。他のすべてを破棄します。恒久的に。それらはすべて悪い考えです。

  2. スタンドアロンの短いPythonスクリプトとして実際に機能する場合subprocess.Popen(command)は、ApacheCGI-binユーザー名がこれを実行するために必要な権限を持っているかどうかを調査する必要があります。覚えて。Apacheはあなたのようには動作しません。これは、個別の特権を持つ個別の「人」として実行されます。

  3. javaコマンドは、おそらくsys.stdoutまたはsys.stderrにデータを吐き出している可能性があります。その場合、その出力はApacheに送られます。理想的には、いくつかのものは、適切なヘッダーであり、すべてが良好であるsys.stdoutを介してApacheにすでに送信されています。

    ただし、バッファリングの方法が原因で、Apacheが使用可能な応答を認識せず、Java出力が混乱する可能性がわずかにあります。

mod_wsgi制御が簡単なため、CGIの代わりに切り替えることをお勧めします。

また、サブプロセスの出力をファイルにキャプチャしてから、そのファイルをsys.stdoutにコピーして、ApacheがJavaサブプロセスと混同されないようにすることをお勧めします。

于 2011-03-28T10:17:38.853 に答える