内部服务器错误 - Python CGI

时间:2011-03-28 08:30:03

标签: java python cgi popen internal-server-error

我目前正在编写一个CGI脚本,其最终目标是运行java程序,然后重定向到另一个页面。但是,当我调用try运行java程序时,CGI导致500内部服务器错误。我已经尝试过os.system(“[command]”)并调用([“command”])和subprocess.Popen(“command”),所有这三个都会导致出现同样的问题。非常感谢任何建议。

编辑此外,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,因此是重定向。

如果只注释了进程命令,则内部服务器错误会发生

编辑结束放弃并转移到php执行此脚本。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你试过了吗?

import cgitb

cgitb.enable()

在浏览器中获取更有意义的错误 - python错误消息

从服务器的命令行运行脚本以查看python是否返回错误,如果是,是否有助于诊断问题?

将您的java调用打印为python脚本的html输出?

答案 1 :(得分: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. 如果subprocess.Popen(command)确实可以作为独立的简短Python脚本运行,那么您必须调查Apache CGI-bin用户名是否具有运行此脚本所需的权限。记得。 Apache不会像你一样运行。它作为一个单独的“人”运行,具有不同的权限。

  3. 您的java命令可能会将数据喷入sys.stdout和/或sys.stderr。如果是这样,该输出将转到Apache。理想情况下,一些东西已经通过sys.stdout传到了Apache,这是一个合适的标题,一切都很好。

    但是,由于事物被缓冲的方式,Apache没有可能看到没有可用的响应,并且java输出令人困惑。

  4. 我建议您切换到mod_wsgi而不是CGI,因为它更容易控制。

    我还建议您捕获文件中的子进程输出,然后将该文件复制到sys.stdout,以便Apache不会被Java子进程混淆。