Python-从internet下载.exe文件

Python-从internet下载.exe文件,python,execution,download,Python,Execution,Download,在为我的程序创建自动更新程序的过程中,我很难成功下载.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版本兼容 你在跑步。检查计算机的 系统

在为我的程序创建自动更新程序的过程中,我很难成功下载.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位) 程序的版本,然后 请与软件发行商联系

我自己上传了执行结果,以前效果很好

我还尝试了一些我发现的其他下载方法,这导致了相同的错误,我还尝试了上传到不同的网站,以确保不是这样

我需要用什么特别的方法来做这件事

编辑:

我对下载做了进一步的测试。我在另一台计算机上运行了这个程序(我现在使用的是斯宾塞发布的东西)——一个32位系统。(我的是64位。)我没有在那台计算机上看到错误,但是当我运行程序时,命令行出现了,因为它是一个命令行样式的.exe,我正在使用它作为我的测试下载,但是闪烁的白色输入条在我必须结束程序之前只是到处弹跳,所以很明显有些东西被破坏了


此外,是否可以使用批处理文件进行下载过程?这几乎更容易,因为程序必须重新启动才能开始使用新的更新,因为它使用的是全新的.exe。(我将使用py2exe使程序成为.exe。)

我怀疑您需要在调用
打开
时包含
b
(二进制)标志:

import urllib url = '--insert-url--' f = urllib.urlopen(url) file = f.read() f.close() f2 = open('download.exe', 'wb') f2.write(file) f2.close()
根据urllib的官方python文档:

一个警告:read()方法,如果 size参数被省略或为负数, 在数据结束前可能无法读取 流动没有什么好办法可以解决这个问题 确定从 已在常规中读取套接字 案例

同一图书馆的另一个选择是

import urllib

url = '--insert-url--' 

filename = 'download.exe'  
urllib.urlretrieve(url, filename)

所以,我想你可能有不同的问题

我的规范:Python3.X,通过自制安装。使用Python的urllib.request模块,因为它是当前支持的模块

我认为您正在下载一个html页面,该页面将您重新路由到下载链接。这是特别的情况,如果你试图从链接下载。许多网站和服务器都有你点击的按钮,这将提供一个不同的url下载

例如,如果您尝试下载任何内容,如FCIV校验和程序,则“下载”按钮实际上会将您路由到不同的url


答复 我的建议是将原始答案中下载的字节文件加载为.htm/l文件。从这里,您可以尝试查找带有应用程序扩展名的url

例如,如果您坚持使用该示例,您将下载出现相同错误的内容:

此文件的版本与正在运行的Windows版本不兼容。请检查计算机的系统信息,查看您是否需要x86(32位)或x64(64位)版本的程序,然后与软件发行商联系

仔细检查后,如果将此文件加载为.htm/l文件,则可以搜索x86字符串并发现它位于实际名称为
的url上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
权限打开。

由于文件扩展名为“.exe”,我假定您在Windows上执行此操作。尝试将
f2
文件上的模式更改为
'wb'
以二进制模式写入。默认为文本模式,但会将遇到的所有换行符(字节)更改为回车+换行符。如果您手动下载(通过webbrowser访问)并执行它,您会遇到同样的问题吗?@Senthil如果我手动下载它,效果会很好。这很奇怪。您是否可以将用Python下载的
.exe
与“正在工作的”
.exe
进行区分,以查看差异?(我不使用Windows,所以我不能推荐diff工具…但我相信谷歌会有一些建议)我使用WinDiff,它发现的唯一区别是它们有不同的创建日期。你必须小心diff程序,如果它们不使用二进制diff,那么它们可能会给你一个假阴性。事实上,windiff不支持二进制比较。有人知道一个免费的diff程序支持二进制吗?…非常有趣,我没有意识到这一点。如果这是解决方案,请在这里发表评论,这样我会注意到。它似乎加快了下载速度,但仍然不起作用。
import urllib

url = '--insert-url--' 

filename = 'download.exe'  
urllib.urlretrieve(url, filename)