2011-03-28 64 views
1

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

编辑此外,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来执行此脚本。感谢所有的帮助!

+0

你可以发布你的代码吗?看起来像你的代码有错误,或者你的代码不会首先生成http头文件。 – YOU 2011-03-28 08:37:00

+0

只有一些。我会尽我所能。 – mrK 2011-03-28 08:42:53

回答

1

你试过:

import cgitb 

cgitb.enable() 

得到一个更有意义的错误 - 蟒蛇错误消息在浏览器中

运行命令行脚本在服务器上,看看python返回一个错误,如果有的话,如果它有助于诊断问题?

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

+0

没有更明确的错误来实现这一点。在/var/log/apache2/error.log中只是[127.0.0.1]格式错误的标头 – mrK 2011-03-28 18:13:35

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输出令人困惑的可能性很小。

我建议您切换到mod_wsgi代替CGI,因为它更容易控制。

我还建议你捕获文件中的子进程输出,然后将该文件复制到sys.stdout中,以便Apache不会被java子进程弄糊涂。

+0

所有这三行都是从程序内部运行可执行文件的不同方式。所有这三个工作时不从服务器运行,一次只使用一个。从该代码块开始,所有三个都被注释掉了,因为如果它们在其中,我就无法运行该站点。 – mrK 2011-03-28 17:59:15

+0

调用来自“from subprocess import call” – mrK 2011-03-28 18:03:19

+0

如何赋予程序执行权限给apache? – mrK 2011-03-28 19:36:51