在为我的程序创建自动更新程序的过程中,我无法成功下载.exe文件。
我在做的事情是这样的:
import urllib
url = '--insert-url--'
f = urllib.urlopen(url)
file = f.read()
f.close
f2 = open('download.exe', 'w')
f2.write(file)
f2.close
我在下载时没遇到任何错误,但是当我尝试运行执行时,我收到以下错误:
此文件的版本不是 与Windows版本兼容 你在跑。检查你的电脑 系统信息,看你是否 需要x86(32位)或x64(64位) 该程序的版本,然后 联系软件发行商。
我自己上传了执行,之前它运行良好。
我还尝试了一些我发现的其他各种下载方法,导致同样的错误,我也尝试上传到不同的网站,以确保不是它。
我需要采取特殊方式吗?
编辑:
我通过下载进行了一些进一步的测试。我在另一台计算机上运行程序(我正在使用Spencer发布的内容) - 一个32位系统。 (我的是64位。)我没有在那台计算机上得到错误,但是当我运行程序时,命令行出现了,因为它是一个命令行样式.exe,我用作我的测试下载,但是在我必须结束程序之前,闪烁的白色条目栏就会反弹到所有地方,所以有些东西显然已经被破坏了。
此外,使用批处理文件可以下载过程吗?这几乎会更容易,因为程序将不得不重新开始使用新的更新,因为它使用的是全新的.exe。 (我将使用py2exe使程序成为.exe。)
答案 0 :(得分:3)
我怀疑您需要在b
的通话中加入open
(二进制)标记:
import urllib url = '--insert-url--' f = urllib.urlopen(url) file = f.read() f.close() f2 = open('download.exe', 'wb') f2.write(file) f2.close()
此外,您在.close()
的来电中省略了父母。不确定这是您的理解或示例的问题,但我已在上面的代码中修复它。
此外,如果您的.exe
很大,您可能希望在下载时将其写入文件(目前您正在将整个内容读入内存)。这看起来像是:
f2 = open("download.exe", "wb")
try:
while True:
data = f.read(4096)
if not data:
break
f2.write(data)
finally:
f.close()
f2.close()
答案 1 :(得分:2)
根据urllib的官方python文档:
一个警告:read()方法,如果是 size参数被省略或为负, 直到数据结束才可能读取 流;没有好办法 确定整个流来自 已经读过一个套接字 情况下。
来自同一个库的替代方案
import urllib
url = '--insert-url--'
filename = 'download.exe'
urllib.urlretrieve(url, filename)
答案 2 :(得分:0)
所以,我想也许你有一个不同的问题。
我的规格:Python3.X,通过Homebrew安装。使用Python的urllib.request模块,因为它是当前支持的模块。
我认为您正在下载一个html页面,该页面会将您重新路由到下载链接。如果您尝试从链接下载,则尤其如此。您可以通过许多网站和服务器单击按钮,该按钮将提供不同的URL供您下载。
例如,如果您尝试下载任何Microsoft link,如FCIV校验和程序,下载按钮实际上会引导您通过不同的URL。
我的建议是,将原始答案中下载的字节文件作为.htm / l文件加载。从这里,您可以尝试找到具有应用程序扩展名的URL;
例如,如果您坚持使用FCIV示例,则会下载出现相同错误的内容:
此文件的版本与您正在运行的Windows版本不兼容。检查计算机的系统信息,以确定是否需要该程序的x86(32位)或x64(64位)版本,然后与软件发行商联系。
仔细观察,如果您将此文件作为.htm / l文件加载,则可以搜索x86字符串并发现它位于实际名称为https://download.microsoft.com/download/c/f/4/cf454ae0-a4bb-4123-8333-a1b6737712f7/Windows-KB841290-x86-ENU.exe
的网址上。之后,如果您尝试使用这个新的url / https请求在OP下载,你实际上会有一个正确的.exe。
编辑很抱歉,这个答案可能仅适用于2017年的Python3.X。对于6年前提出的原始问题,答案有点晚了。此外,文件编写中有关b
标志的其他答案和注释也是正确的。应使用wb
权限打开该文件。