【问题标题】:Simple http server in Python 3.5.1 ShellPython 3.5.1 Shell 中的简单 http 服务器
【发布时间】:2016-06-04 20:50:06
【问题描述】:

我正在尝试使用下面代码中的目录作为根目录来运行一个简单的 http 服务器。这是使用 Python 3.5.1 Shell:

>>> import os
>>> import http.server
>>> import socketserver
>>> os.chdir('c:/users/owner/desktop/tom/tomsEnyo2.5-May27')
>>> python -m http.server 8000
SyntaxError: invalid syntax
>>> python -m SimpleHTTPServer 8000
SyntaxError: invalid syntax
>>>  

我看过一个类似的主题:How to set up simple HTTP server in Python 3.5 on Windows 10?,但即使我尝试按照答案的建议去做,我仍然遇到同样的问题(“无效语法”)。

【问题讨论】:

标签: python shell


【解决方案1】:

您混淆了 Python 命令和 shells 命令。

import os 等是 Python 语句(由 Python 解释),python -m http.server 8000 是一个 shell 语句,由 bashsh 或任何 Microsoft 用于 Windows 的东西解释。您可以尝试这样的方式在 Python REPL 中运行它:

import os
from http.server import SimpleHTTPRequestHandler, HTTPServer                                                                                                                                   

os.chdir('c:/users/owner/desktop/tom/tomsEnyo2.5-May27')                                                                                                                                                                                      
server_address = ('', 8000)                                                                                                                                                                    
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)                                                                                                                                   
httpd.serve_forever()

但最简单的方法可能是在终端模拟器的正确目录中运行python -m http.server 8000。请注意,在最新版本的 Python 中,http.server 模块还接受 --directory-d 选项来指定要服务的目录。

【讨论】:

  • 谢谢你的最后一段!我已经很长时间 破解 Python/Django 了,而且我从未想过做这样的事情。它的简单性令人惊叹(可能也非常不安全)。
  • @PeterRowell 添加一个--bind 127.0.0.1 和 BOOM,它的安全性要低得多 ;-)
  • @JulienPalard 我在使用 os.chdir('c:/users/owner/desktop/tom/tomsEnyo2.5-May27') 后尝试使用 python -m http.server 但出现语法错误.而且你上面给我的代码不起作用我也遇到了语法错误(但它没有指定语法错误的位置)
  • @Thomas 你还在混淆 python 和 shell 命令。你不能在你的 Python REPL 中输入“python -m http.server”,这不是 Python 代码,这是一个带有参数的程序(是 Python)调用(是 -mhttp.server)。
  • @JulienPalard 哦,好的,谢谢,所以我需要一个实际运行 Python 的程序(即像 Eclipse 运行 Java)吗?或者有什么方法可以从 Shell 启动 Web 服务器?
【解决方案2】:

问题是python -m命令本身不是python命令,但应该在shell中使用;)

你可以改用:

import http.server

def start_server(port=8000, bind="", cgi=False):
    if cgi==True:
        http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler, port=port, bind=bind)
    else:
        http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler,port=port,bind=bind)

start_server() #If you want cgi, set cgi to True e.g. start_server(cgi=True)

或者,你也可以这样做:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

httpd = socketserver.TCPServer(("", PORT), Handler)

print("serving at port", PORT)
httpd.serve_forever()

【讨论】:

    【解决方案3】:

    在 Python shell 中运行 Web 服务器的想法本身是错误的,因为服务器是一个应该永远运行的系统级进程。您可以尝试使用subprocess 库来运行它吗?

    此外,您不能在 shell 中运行 python 可执行文件。运行 shell 后,您需要逐行键入 code,而不是 OS 可执行文件。 如果您想启动服务器,则需要使用 SimpleServer 类从操作系统命令行中的目录运行python 可执行文件;该目录将通过 Web 服务器提供服务。

    【讨论】:

      【解决方案4】:
      import socket
      import sys
      
      try:
       HOST = 'Your_ip'
       PORT = 80
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
       s.bind((HOST, PORT))
       s.listen(10)
       print '[*]Running HTTP on port %s..'%PORT
       while 1:
          conn, addr = s.accept()
          print 'Connected with ' + addr[0] + ':' + str(addr[1])
          data = ""
          while 1:
              request = conn.recv(8000)
              data += request
              if len(data) == 24:
                  print data
                  req_list = data.split(' ')
                  method = req_list[0]
                  req_file = req_list[1]
                  print 'The Requested file from client: ', req_file
                  fileid = req_file.split('?')[0]
                  fileid = fileid.lstrip('/')
                  print fileid
                  if(fileid == 'index.html'): #verifies index.html
                      file = open(fileid,'rb')
                      response = file.read()
                      file.close()
                      header ='HTTP/1.1 200 OK\n'
                      mimetype = 'text/html'
                      header += 'Content-Type: '+str(mimetype)+'\n\n'
                  else:
                      header = 'HTTP/1.1 404 Not Found\n\n'
                      response = '<html><body><h3>Error 404: File not found</h3></body></html>'
                  final_response = header.encode('utf-8')
                  final_response += response
                  conn.send(final_response)
              else:
                  continue
          conn.close()
      
      except KeyboardInterrupt as msg:
       sys.exit(0)
      

      HTTP 服务器(Linux 中的等效实现)侦听端口 80,并且可以自定义为侦听所有不同的端口。如果存在 index.html 文件,此服务器会解析 GET 请求并发送成功响应,如果客户端尝试访问其他 .html 文件则不成功。替代一个班轮 bash 网络服务器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 2015-01-28
        • 1970-01-01
        相关资源
        最近更新 更多