2016-06-04 2 views
0

Я пытаюсь получить простой HTTP-сервер, используя каталог в моем коде ниже в качестве корня. Это использование Python 3.5.1 Shell:Простой 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?, но даже когда я пытаюсь делать то, что подсказывает ответ, я по-прежнему имеют те же проблемы («неверный синтаксис»).

+0

http://stackoverflow.com/questions/27568283/python-3-http-server-syntax-error –

ответ

6

Вы вводите в заблуждение команду Python и команду shells.

import os и т.д. является заявлением Python (интерпретируемый Python), python -m http.server 8000 это оболочка заявление, интерпретируется bash, sh или любой Microsoft использовать для Windows. Вы можете попробовать что-то вроде этого, чтобы запустить его в Python РЕПЛ:

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, чтобы указать каталог для обслуживания.

+0

Спасибо за последний парашют! Я взламывал Python/Django за * долгое время, и что-то подобное мне так и не пришло. Это потрясающе в своей простоте (вероятно, также небезопасно, как ад). –

+0

@PeterRowell Добавить '--bind 127.0.0.1' и BOOM, который намного менее небезопасен ;-) –

+0

@JulienPalard Я попытался использовать python -m http.server после использования os.chdir ('c:/users/owner/desktop/tom/tomsEnyo2.5-May27 '), но я получаю синтаксическую ошибку. И код, который вы мне указали выше, не работал. У меня также была синтаксическая ошибка (но она не указала, где была синтаксическая ошибка). –

0

Проблема заключается в том, что команда python -m не сама команда питона, но должны быть использованы в оболочке;)

Вы можете использовать вместо:

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() 
0

Сама идея запуска веб-сервера в оболочку Python неверна, поскольку сервер представляет собой процесс на системном уровне, который должен запускаться вечно. Вы можете попробовать запустить его, используя библиотеку subprocess?

Кроме того, вы не можете запустить python исполняемый файл в оболочку. После запуска оболочки вам нужно ввести код по строке, а не исполняемые файлы операционной системы. Если вы хотите запустить сервер, вам нужно вместо этого выполнить python исполняемый файл из каталога в командной строке ОС, используя класс SimpleServer; этот каталог будет обслуживаться через веб-сервер.

0
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, и может быть настроен для прослушивания на все различные порты. Этот сервер анализирует запрос GET и отправляет успешный ответ, если присутствует файл index.html, и его неуспешно, если клиент пытается получить доступ к другому .html-файлу. Альтернатива одному веб-серверу liner bash

Смежные вопросы