2016-01-21 177 views
3

我想编写Python脚本,将:的Python:运行SimpleHTTPServer,并要求它在脚本

  1. 开始SimpleHTTPServer某些端口上
  2. 向服务器的请求,并通过发送一些数据POST
  3. 通过在交互模式的shell
  4. 运行脚本,并进行交互与它

现在的代码如下所示:

import SimpleHTTPServer 
import SocketServer 
import urllib 
import urllib2 

# Variables 
URL = 'localhost:8000' 
PORT = 8000 

# Setup simple sever 
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
print "serving at port", PORT 
httpd.serve_forever() 

# Getting HTML from the target page 
values = { 
    'name': 'Thomas Anderson', 
    'location': 'unknown' 
} 
data = urlilib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
html = response.read() 

的问题是,一旦我跑我的脚本

python -i foo.py 

它打印serving at port 8000,然后冻结。我敢打赌,这对蟒蛇大师来说简直是微不足道的,但我们会很感激。

回答

3

运行服务器作为不同的过程,这将允许您运行脚本的其余部分。我想用requests比urllib。

import SocketServer 
import SimpleHTTPServer 

import requests 
import multiprocessing 

# Variables 
PORT = 8000 
URL = 'localhost:{port}'.format(port=PORT) 

# Setup simple sever 
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
print "Serving at port", PORT 

# start the server as a separate process 
server_process = multiprocessing.Process(target=httpd.serve_forever) 
server_process.daemon = True 
server_process.start() 

# Getting HTML from the target page 
values = { 
    'name': 'Thomas Anderson', 
    'location': 'unknown' 
} 

r = requests.post(URL, data=values) 
r.text 

# stop the server 
server_process.terminate() 
+1

谢谢,这是我一直在寻找,但由于蟒蛇体验极限无法得到。 – Oleg

+0

我注意到的一件事是,尝试执行此操作时出错:socket.error:[Errno 10048]每个套接字地址(协议/网络地址/端口)只有一个用法是允许的 ted – Oleg

+0

这很可能由于这样的事实,至少在你的例子中,你并没有关闭你的http服务器。请参阅我的答案了解更多详情。 –

4

在单独thread或者运行它:

import SimpleHTTPServer 
import SocketServer 
import urllib2 
from threading import Thread 
from datetime import time 

# Variables 
URL = 'localhost:8000' 
PORT = 8000 

# Setup simple sever 
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
print "serving at port", PORT 
def simple_sever(): 
    httpd.serve_forever() 

simple_sever_T = Thread(target=simple_sever, name='simple_sever') 
simple_sever_T.daemon = True 
simple_sever_T.start() 

while not simple_sever_T.is_alive(): 
    time.sleep(1) 

# Getting test file 
req = urllib2.Request('http://localhost:%s/test_file' % PORT) 
response = urllib2.urlopen(req) 
print response.read() 
httpd.shutdown()