【问题标题】:Internal Server Error - Python CGI内部服务器错误 - Python CGI
【发布时间】:2011-03-28 08:30:02
【问题描述】:

我目前正在编写一个 CGI 脚本,其最终目标是运行 Java 程序,然后重定向到不同的页面。但是,当我调用尝试运行 java 程序时,CGI 会导致 500 内部服务器错误。我已经尝试过 os.system("[command]") 和 call(["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,因此是重定向。

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

EDIT 最终放弃并转向 php 来执行此脚本。感谢大家的帮助!

【问题讨论】:

  • 你能发布你的代码吗?看起来您的代码中有错误,或者您的代码没有首先生成 http 标头。
  • 只是其中的一部分。我会尽力而为。

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


【解决方案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 子进程混淆。

【讨论】:

  • 所有这三行都是从程序内部运行可执行文件的不同方式。当不从服务器运行并且一次只使用一个时,这三个都可以工作。从那个代码块开始,所有三个都被注释掉了,因为如果它们在其中,我将无法运行该站点。
  • 调用来自“从子流程导入调用”
  • @mrK:这是 Linux 系统管理的问题。 chmod ugo+x some_file.py 将授予执行权限。但是 Apache 有一组过滤器,因此 root 拥有的文件永远不会被执行。
  • 所以如果我对我说它可能会起作用?我认为它们目前可能归 root 所有
【解决方案2】:

你试过了吗:

import cgitb

cgitb.enable()

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

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

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

【讨论】:

  • 启用此功能没有更明显的错误。只是 /var/log/apache2/error.log 中的 [127.0.0.1] 标头格式错误
猜你喜欢
  • 2011-10-09
  • 2016-04-24
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
相关资源
最近更新 更多