Python代码未执行
我有以下从命令行执行的代码:Python代码未执行,python,http-post,Python,Http Post,我有以下从命令行执行的代码: import cgi,time,os,json,sys,zipfile,urllib2 from os import curdir, sep from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from time import strftime from poster.encode import multipart_encode, MultipartParam from poster.strea
import cgi,time,os,json,sys,zipfile,urllib2
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from time import strftime
from poster.encode import multipart_encode, MultipartParam
from poster.streaminghttp import register_openers
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
if self.path.endswith("/"):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write("<HTML> GET OK.<BR>")
return
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
def do_POST(self):
global rootnode
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
if ctype == 'multipart/form-data':
query=cgi.parse_multipart(self.rfile, pdict)
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
file = query.get('file')
zfile = "C:\Users\VM1\Desktop\data.zip"
extract_path = "C:\Users\VM1\Desktop\data\\"
f = open(zfile, "wb")
f.write(file[0])
f.close()
self.wfile.write("POST OK. File received from VM Host")
print("File received from VM Host.")
print("Unzipping zip file")
unzip = zipfile.ZipFile(zfile)
unzip.extractall(extract_path)
print "Files extracted to " + extract_path
scan_path = '"C:\Program Files (x86)\AVG\AVG2012\\avgscana.exe" /repok /report=C:\Users\VM1\Desktop\\avg_scan_results.txt /scan=' + extract_path
os.system('"%s"' % scan_path)
self.write_json_report()
self.upload_json_report()
return
def write_json_report(self):
scan_results = open("avg_scan_results.txt", "r")
saved = sys.stdout
f = file('avg_report.json', 'wb')
sys.stdout = f
dict2 = {}
for line in scan_results:
if ".jpg" in line:
result = line.split('\\')
result_split = result[5].split(' ')
filename = result_split[0]
raw_status = result_split[3]
if "OK" in raw_status:
status = "Okay"
status_code = "0"
elif "Virus identified" in raw_status:
status = raw_status
status_code = "1"
dict2[filename] = {'FileName': filename, 'DateTime': strftime("%Y-%m-%d %H:%M:%S"), 'statusCode': status_code, 'Description': status}
print json.dumps(dict2)
sys.stdout = saved
f.close()
print ""
print "JSON report written"
json_zip = zipfile.ZipFile("avg_report.zip", "w")
try:
json_zip.write('avg_report.json')
finally:
json_zip.close()
return
def upload_json_report(self):
av_name = "AVG Free 2012"
av_version = ""
scan_results = open("avg_scan_results.txt", "r")
for line in scan_results:
if "Program version" in line:
version_split = line.split(', ')
program_version_full = version_split[0]
program_version_split = program_version_full.split(' ')
av_version = program_version_split[2]
register_openers()
datagen, headers = multipart_encode({"av_name": av_name, "av_version": av_version, "filename": "avg_report.zip", "content": open("avg_report.zip", "rb")})
request = urllib2.Request("http://" + self.client_address[0] + ":8080/", datagen, headers)
print "Uploading JSON report"
print urllib2.urlopen(request).read()
return
def main():
try:
server = HTTPServer(('', 8080), MyHandler)
print 'Server started..'
server.serve_forever()
except KeyboardInterrupt:
print 'KeyboardInterrupt received, shutting down server'
server.socket.close()
if __name__ == '__main__':
main()
这起作用了。我不明白为什么相同的代码行不能在函数中工作 我建议调试代码。为此,我要删除
print
语句,在urlib2.urlopen
方法调用之前添加pdb.set\u trace
,然后运行脚本。一旦调试器接管,我将检查url是否是您期望的url,尝试执行下一行并检查urlib2.urlopen
返回的值(响应代码、文本等)。这将为您提供有关正在发生的事情的足够信息,并希望让您知道如何解决问题。urlib2.urlopen(…)
返回一个文件描述符对象,您必须读取该对象才能打印出响应。基本上,为了查看它从服务器得到什么响应,您需要执行以下操作:打印urlib2.urlopen(request).read()BaseHTTPRequestHandler
维护一个单线程(和单进程)服务器。这意味着在执行另一个请求之前,每个请求都必须完成执行
从do\u POST
方法中调用upload\u json\u report
函数。当它运行时,您的服务器无法处理其他任何事情。但在这一行:
print urllib2.urlopen(request).read()
实际上,您正在尝试将.zip文件上载到同一端口8080。因此,upload\u json\u report
正在等待do\u POST
完成,而do\u POST
正在等待upload\u json\u report
完成,所以他们当然不会停止等待
顺便说一句,这解释了为什么它在您的服务器上工作(我假设它是多线程的,不过您需要提供更多详细信息),以及为什么它在使用单独的客户端执行时工作(它不等待自己完成)。我的建议是在“urllib2.urlopen”行周围添加“try”“except”,查看是否引发了任何异常
try:
request = urllib2.Request("http://" + self.client_address[0] + ":8080/", datagen, headers)
except Exception, e:
print e
通过打印的异常信息,您可能有一些线索。您确定urllib2正在工作吗?在python解释器上试试这个,看看它是否正常工作。>>import urllib2>>>>response=urllib2.urlopen(“)我的urllib2肯定在工作,因为我从
register\u openers()
开始复制和粘贴代码,它工作了发布的代码不是有效的Python(例如,请参阅第12-18行的缩进).我不想更改它,因为我不确定原件是什么,而且它更改了含义。这是我的格式错误,我对它进行了编辑。很好-但是仍然有一个错误(缩进的第二个返回行)我已经试过了,但是代码仍然没有执行,我的服务器也没有收到任何POST请求谢谢你的回答!我会尝试一下,并给你们一个关于如何检查url的更新?我已经试过了,但无法得到任何url的打印输出url@androidnoob在调试器中,p request.get\u full\u url()
应该打印生成的url。它只打印出我的服务器的ip地址,没有变量,我想它不是后编码的。但奇怪的是,它在我的服务器上工作,但不是这个。我明白了。我有一个服务器正在使用与此相同的结构运行。有没有办法使它成为多线程的?首先,我不完全是ure为什么您要让此服务器有效地将文件上载到自身。还是将其发送到客户端?此代码位于VM中,它将在从客户端接收文件后将文件上载到VM主机服务器。VM位于与主机服务器不同的机器上?问题是它们是否都将使用端口8080。此外,为什么不不要将现有服务器(如apache)与mod_python一起使用?VM与主机服务器位于同一台机器上。我使用上述代码是因为我想要一个轻量级解决方案。但我将在apache上与mod_python一起试用,看看效果如何。感谢您的建议
try:
request = urllib2.Request("http://" + self.client_address[0] + ":8080/", datagen, headers)
except Exception, e:
print e