Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部服务器错误-Python CGI_Java_Python_Cgi_Popen_Internal Server Error - Fatal编程技术网

Java 内部服务器错误-Python CGI

Java 内部服务器错误-Python CGI,java,python,cgi,popen,internal-server-error,Java,Python,Cgi,Popen,Internal Server Error,我目前正在编写一个CGI脚本,其最终目标是运行一个java程序,然后重定向到另一个页面。但是,当我调用try来运行java程序时,CGI会导致500内部服务器错误。我尝试过os.system(“[command]”)和call([“command]”)以及subprocess.Popen(“command”),这三种方法都会导致出现相同的问题。如有任何建议,我们将不胜感激 编辑此外,apache日志几乎没有提供任何信息,只说明存在无效的头 编辑 #!/usr/bin/python # Impo

我目前正在编写一个CGI脚本,其最终目标是运行一个java程序,然后重定向到另一个页面。但是,当我调用try来运行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>"
#/usr/bin/python
#导入CGI模块
导入cgi
随机输入
导入操作系统
导入系统
进口稀土
导入子流程
#必需的标题,告诉浏览器如何呈现HTML。
打印“内容类型:text/html\n\n”
form=cgi.FieldStorage()
userID=random.random()
打印“”
打印“结果”
打印“”
command=“java[classname]”
user\u id=random.randint(0,sys.maxint)
命令+=str(用户id)+“”
command+=re.sub(r'\s','',form['key0'].value)+“
command+=表单['key1']。值+“”
command+=表单['key2']。值+“”
command+=form['key3'].value+“”如果form.has_key('key3'),则为“0”
##这就是问题所在
#操作系统(“ls-l”)
#调用([“ls”,“-l”])
#p=子流程.Popen(命令)
##问题的结束
打印命令
打印“
” 打印“重定向…” 打印“” 打印“” 打印“”
整个命令都不在那里,但我相信它是正确构建的,因为我可以将打印的命令复制出来并在终端中运行,它运行得非常完美。该命令只是java[classname][9 args]

java代码在python代码之外平稳运行,它所做的只是生成一个.png文件和一个包含.png的.html文件。文件名为[user\u id].html,因此重定向

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

EDIT最终放弃并转到php执行此脚本。谢谢你的帮助

您是否尝试过:

import cgitb

cgitb.enable()
要在浏览器中获取更有意义的错误-python错误消息

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

从python脚本中将java调用打印为html输出

## This is where the problem exists
#os.system("ls -l")
#call(["ls", "-l"])
#p = subprocess.Popen(command)
## End of Problem
  • 关注
    子流程.Popen
    。丢弃所有其他的。永久地。这些都是坏主意

  • 如果
    subprocess.Popen(command)
    确实作为一个独立的短Python脚本工作,那么您必须调查Apache CGI bin用户名是否具有运行此脚本所需的权限。记得。Apache不像您那样运行。它作为一个单独的“人”运行,具有单独的权限

  • 您的java命令可能正在向sys.stdout和/或sys.stderr中喷射数据。如果是这样的话,该输出将转到Apache。理想情况下,一些东西已经通过sys.stdout发送到Apache,这是一个合适的头文件,一切都很好

    然而,由于缓冲方式的原因,Apache很可能没有看到可用的响应,java输出令人困惑

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


    我还建议您将子流程输出捕获到一个文件中,然后将该文件复制到sys.stdout,这样Apache就不会被java子流程弄糊涂。

    您能发布代码吗?看起来您的代码中有错误,或者您的代码没有首先生成http头。只生成其中的一部分。我会尽我所能。这三行代码都是从程序内部运行可执行文件的不同方式。这三种方法在不从服务器运行时都可以工作,并且一次只使用一种。在该代码块中,所有三个都被注释掉了,因为如果它们在其中,我就无法运行该站点。调用来自“来自子进程导入调用”@mrK:这是Linux sys管理的问题
    chmod ugo+x some_file.py
    将授予执行权限。但是Apache有一组过滤器,所以root拥有的文件永远不会被执行。所以如果我向自己求助,它可能会工作吗?我认为它们可能是root所有,但启用此功能时没有出现更明显的错误。只有/var/log/apache2/error.log中的[127.0.0.1]头格式错误