gpt4 book ai didi

java - Python 脚本不会在本地主机 gae 开发服务器的 urlopen 之后读取()——对等连接重置

转载 作者:行者123 更新时间:2023-11-30 11:48:25 25 4
gpt4 key购买 nike

所以我在本地主机上运行 Google App Engine 开发服务器 (Java)。我正在尝试使用 Python 2.7 urllib.urlopen 检索 URL。初始检索有效,但是当我尝试调用 read() 或 readlines() 时,我得到:

Traceback (most recent call last):
File "./getMap.py", line 6, in <module>
lst = f.readlines()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 513, in readlines
line = self.readline()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 445, in readline
data = self._sock.recv(self._rbufsize)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 552, in read
s = self.fp.read(amt)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 378, in read
data = self._sock.recv(left)
socket.error: [Errno 54] Connection reset by peer

浏览器工作,wget 工作。 urllib 和 urllib2 都会出现问题。这是代码:

import urllib2

f = urllib2.urlopen("http://localhost:8080/default.jsp")
lst = f.readlines()

for a in lst:
print a

奇怪的是,我可以使用 readline() 打印出文件的第一行——我只是无法获取整个 文件。我感觉 Python 可能是“懒惰地”不请求 URL 的全部内容,直到我通过 readlines() 请求它,然后应用引擎开发服务器已经过分热心地关闭了连接。但我可能完全错了。

我尝试研究这个问题,但没有发现任何适用的东西。我看到的大多数 Google 命中都围绕着随机的、间歇性的计时问题(这不是间歇性问题,它是可靠的)或代理/防火墙问题(这里没有发生这样的事情)。

假设我的理论是正确的——有没有办法告诉 urlopen 立即获得整个响应,就像 wget 和浏览器似乎正在做的那样?或者有没有办法告诉 GAE 开发服务器冷静下来,不要那么快关闭连接?如果没有必要,我宁愿不深入研究较低级别的 Python 套接字。

谢谢

附注说明:python 脚本只是从命令行运行,并试图连接到在同一个盒子上运行的 GAE 开发服务器。我不是在尝试从自身或类似的东西连接到 GAE 开发服务器,GAE 服务器运行的是 Java,而不是 Python。我实际上想在这里做的是:我的 GAE 网络应用程序有一些网络服务,我正在编写一个批处理脚本来获取/发布到这些网络服务,这样当我需要重置/清除数据存储时(例如: 数据已损坏)我可以先使用此 Python 脚本备份数据,然后删除数据存储,然后再次使用该脚本将数据重新加载。

更新:所以我尝试了更多测试。 Python 可以轻松读取 GAE 开发服务器提供的任何 HTML 文件。然而,任何 JSP,即使是最简单的“hello world”JSP,都无法读取并出现相同的“连接被对等重置”错误。我将尝试更新到 GAE SDK 的 1.6.1 版本,无论如何我都必须在某个时候这样做,最好是现在。希望它能解决这个问题。

最佳答案

虽然我看不出您的 Python 代码有任何问题,也不知道您的 Java GAE 设置可能有什么问题,但我建议对这个问题采取不同的看法。

您提到您基本上想向您的服务器发送 GET/POST 请求并保存/稍后读取内容,并且 wget 等命令行工具可以正常工作。当您需要进行更高级的文本编辑时,我建议您使用 bash 脚本以及 curl 和 python。

curl http://localhost:8080/default.jsp > default.bak
... wipe db ...
data = $(cat default.bak)
curl -X "POST" -d "backup=$data" http://localhost:8080/default_restore.jsp

如果您需要在发送数据之前编辑数据,您可以使用 python 从 default.bak 读取或通过管道将其传输到标准输入

data = $(cat default.bak)
python your_script.py $data

curl http://localhost:8080/default.jsp | python yourscript.py > default.bak

关于java - Python 脚本不会在本地主机 gae 开发服务器的 urlopen 之后读取()——对等连接重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8820042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com