java - 内部服务器错误 - Python CGI

标签 java python cgi popen internal-server-error

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

编辑此外,apache 日志几乎没有给我任何信息,仅说明存在无效 header 。

编辑

#!/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 来执行此脚本。感谢您的帮助!

最佳答案

## 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,这是一个正确的 header ,一切都很好。

    但是,由于缓冲方式的原因,Apache 很有可能没有看到可用的响应,并且 java 输出很困惑。

我建议您改用 mod_wsgi 而不是 CGI,因为它更容易控制。

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

关于java - 内部服务器错误 - Python CGI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5456412/

相关文章:

java - android中的多线程服务器套接字从连接的客户端接收图像 - 不工作

java - 如何只处理 erlang 队列中的最新消息?

python - 在 datetime 对象中添加或更改时间

python - OpenERP 字段保存时间值,例如 `08:04`

使用起始密码子和终止密码子查找编码 DNA 的 Python 代码

java - Android 通知监听器服务自行启动

java - 难以从用户处获取 ID

perl - 与 PHP 的 $_SERVER[...] 等效的 Perl 是什么?

perl - FCGI死了吗?这些天有什么选择?

json - Perl CGI 在帖子中使用 JSON 传递变量