2011-03-28 87 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