python3在linux上cgi脚本无法运行 No such file or directory

学习python3到网络编程cgi脚本这块,有这样一个示例服务器。

import os, sys
from http.server import HTTPServer, CGIHTTPRequestHandler

webdir = '.'      # HTML文件和cgi-bin脚本目录位置
port   = 10001    #

if len(sys.argv) > 1: webdir = sys.argv[1]             # 指定web文件目录
if len(sys.argv) > 2: port   = int(sys.argv[2])        # 指定端口
print('webdir "%s", port %s' % (webdir, port))

os.chdir(webdir)                                       # 在HTML根目录下运行
srvraddr = ('', port)                                  
srvrobj  = HTTPServer(srvraddr, CGIHTTPRequestHandler)
srvrobj.serve_forever()                                # 启动服务端

在这个示例服务器的目录内有一个文件夹:cgi-bin,里面存放了用于演示的cgi脚本tutot.py。
经过测试发现,运行服务后,直接点击cgi-bin目录,会报403错误。
在这里插入图片描述
在这里插入图片描述
测试后发现在windows下,运行cgi脚本需要输入完整全地址才能正确运行cgi:
在这里插入图片描述
但是在linux下,即使输入完整地址也不会正确运行cgi脚本:
在这里插入图片描述
此时服务端报错:

192.168.225.1 - - [27/Mar/2020 17:17:30] "GET /cgi-bin/tutor0.py HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.225.1', 2840)
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/http/server.py", line 1127, in run_cgi
    os.execve(scriptfile, args, env)
FileNotFoundError: [Errno 2] No such file or directory: '/root/j-python/PP4E/Internet/Web/cgi-bin/tutor0.py'
----------------------------------------

但是文件分明是存在的,经过上网搜索发现,这个报错只是名称为 “No such file or directory”,真实原因不一定是"找不到文件或目录"。。。。。。
经过搜索,更改了cgi-bin文件夹内所有文件的权限为777,依旧不能解决问题,当然对于cgi脚本而言,是必须给予可执行权限的。
在这里插入图片描述
考虑到linux上的python脚本文件一般需要加上 #!/usr/bin/python3 指明运行环境才能运行,尝试给cgi脚本增加了#!/usr/bin/python3

#!/usr/bin/python3
print('Content-type: text/html\n')
print('<TITLE>CGI 101</TITLE>')
print('<H1>A First CGI Script</H1>')
print('<P>Hello, CGI World!</P>')

但是问题并没有解决,还是显示一片空白。
在这里插入图片描述
最终发现是由于linux下与windows下编码方式不同,代码在windows记事本编写,到linux下后找不到 #!/usr/bin/python3这行。导致cgi脚本没有找到环境。
尝试删除tutor0.py这个文件,然后在linux下重新创建并编辑。

#!/usr/bin/python3
print('Content-type: text/html\n')
print('<TITLE>CGI 101</TITLE>')
print('<H1>A First CGI Script</H1>')
print('<P>Hello, CGI World!</P>')

完成以上操作后,cgi访问正常:
在这里插入图片描述
总结一下:
python的cgi脚本在linux下的运行有几个关键点需要满足:
1,给予cgi脚本文件足够的执行权限
2,将cgi文件放置于cgi-bin文件夹下(当然还有其他方法)
3,在cgi脚本头部设置环境 #!/usr/bin/python3
4,注意文件的编码方式,文本文件内不能有/r/n这样的windows记事本格式,最好重新在linux下创建的
(vim这样的编辑器是看不到/r/n的,所以最好重新创建文件)。
OVER

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值