摘要: Python cgi脚本在从简单的python调试服务器调用时按预期运行,但从
运行时失败并出现500 Premature end of script headers
~/public_html/cgi-bin/
错误
我的CGI脚本在通过一个简单的python web服务器运行时工作正常,导航到nameofmyhost.com:8080/...
但是,从我的public_html/cgi-bin
目录运行相同的脚本时,它会出现500 premature end of script headers
错误。我该怎么做才能解决这个问题?
该文件的权限似乎没问题:
drwxrwxrwx cgi-bin
-rwxr-xr-x cgi-bin/generate_list.py
这是simple_httpd.py,简单的python webserver
from http.server import HTTPServer, CGIHTTPRequestHandler
port = 8080
httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
print("Starting simple_httpd on port: " + str(httpd.server_port))
httpd.serve_forever()
CGI脚本generate_list.py:
#! /usr/local/bin/python3
import athletemodel
import yate
import glob
data_files = glob.glob("data/*.txt")
athletes = athletemodel.put_to_store(data_files)
print(yate.start_response())
print(yate.include_header("Coach Kelly's List of Athletes"))
print(yate.start_form("generate_timing_data.py"))
print(yate.para("Select an athlete from the list to work with:"))
for each_athlete in athletes:
print(yate.radio_button("which_athlete", athletes[each_athlete].name))
print (yate.end_form("Select"))
print(yate.include_footer({"Home": "/index.html"}))
我猜我可能需要在某处明确说出我的目录,也许?
PS:我正在阅读Oreilly撰写的Head First Python书籍
检查服务器是否可以找到我的文件
服务器在public_home找到简单的html文件 [确定]
检查CGI脚本是否可以正常执行。
Content-type: text/html
<html>
<head>
<title>Coach Kelly's List of Athletes</title>
[...]
CGI脚本从命令行运行 - 按预期输出 [确定]
检查服务器是否可以在同一位置执行简单的CGI脚本
尝试使用简单的CGI脚本来查看服务器是否能够执行任何
#!/usr/local/bin/python3
print("Content-Type; text/html")
print("")
print("<html><body><h1>hello</h1></body></html>")
服务器无法执行简单的CGI脚本,出现相同的错误 [FAIL]
修复1:将数据路径更改为绝对数据路径而不是相对路径:
- data_files = glob.glob("data/*.txt")
+ data_files = glob.glob("/home/delliott/public_html/webapp/data/*.txt")
答案 0 :(得分:0)
问题是学校网络服务器的基础与simple_httpd.py
服务器的基础不同。这意味着您必须提供数据目录的绝对路径而不是相对路径。
更改以下行:
- data_files = glob.glob("data/*.txt")
+ data_files = glob.glob("/home/<username>/public_html/data/*.txt")
现在应该按预期行事(如果我正确理解你的问题。)
[编辑]:检查cgi-bin脚本是否有效的快速方法是从命令行运行它们。登录到您的学校服务器并尝试自己的cgi脚本:
$ cd /home/<username>/public_html/
$ python3 my_cgi_script.py
这应该打印出你期望的html或堆栈跟踪。