2011-04-26 186 views
2

在爲我的程序創建自動更新程序的過程中,我無法成功下載.exe文件。Python - 從互聯網下載.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 

我沒有遇到錯誤,同時下載,但是當我嘗試運行的執行,我收到以下錯誤:

The version of this file is not compatable with the version of Windows you're running. Check your computer's system information to see whether you need an x86(32-bit) or an x64 (64-bit) version of the program, and then contact the software publisher.

我自己上傳執行,並且之前工作正常。

我也嘗試了一些其他的下載方法,我發現,這導致了相同的錯誤,並且我也嘗試上傳到不同的網站以確保它不是這樣。

有沒有特殊的方法,我需要做到這一點?

編輯:

我做了一些進一步的測試與下載。我在另一臺計算機上運行了該程序(我正在使用Spencer發佈的內容) - 一個32位系統。 (Mine是一個64位)。我沒有在那臺計算機上看到錯誤,但是當我運行該程序時,命令行出現了,因爲它是一個命令行樣式.exe,我用它作爲我的測試下載,但閃爍的白色入口欄的東西只是在我必須結束程序之前反彈到所有地方,所以顯然有一些東西被損壞。

此外,下載過程可能與批處理文件?這將會更容易,因爲程序將不得不重新開始使用新的更新,因爲它使用的是全新的.exe。 (我要使用py2exe爲使該計劃的.exe)。

+1

由於文件擴展名是'.exe',我假設你在Windows上這樣做。嘗試將'f2'文件的模式更改爲''wb''以二進制模式寫入。默認是文本模式,同時會將遇到的所有換行符(字節)更改爲回車+換行符。 – martineau 2011-04-26 22:51:37

+0

如果您手動下載(通過網頁瀏覽器訪問它)並執行它,您是否面臨同樣的問題? – 2011-04-26 22:58:54

+0

@Senthil它工作正常,如果我手動下載它。 – 2011-04-27 01:14:32

回答

2

根據官方Python文檔爲的urllib:

One caveat: the read() method, if the size argument is omitted or negative, may not read until the end of the data stream; there is no good way to determine that the entire stream from a socket has been read in the general case.

來自同一庫的替代將是

import urllib 

url = '--insert-url--' 

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

...非常有趣,我沒有意識到這一點。如果這成爲解決方案,請在這裏留言,以便我注意到它。 – 2011-04-27 05:22:37

+0

它似乎加快了下載速度,但它仍然無法正常工作。 – 2011-04-27 19:59:19

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

似乎沒有解決它。 – 2011-04-26 22:53:45

+0

這很奇怪。你能否將使用Python下載的'.exe'分解到「working」'.exe'來查看差異? (我不使用Windows,所以我不能推薦diff工具...但是我相信Google會有一些建議) – 2011-04-26 22:56:48

+0

我使用了WinDiff,唯一的區別是它們有不同的創建日期。 – 2011-04-26 23:32:16

0

所以,我想,也許你有一個不同的問題。

My specs: Python3.X, installed via Homebrew. Using Python's urllib.request module, as it is the currently supported one.

我認爲你正在下載一個html頁面,它將你重定向到下載鏈接。如果您嘗試從鏈接下載,則尤其如此。許多網站和服務器,你需要點擊一個按鈕,這將提供一個不同的URL從下載。例如,如果您嘗試下載任何Microsoft link(如FCIV校驗和程序),則下載按鈕實際上會通過不同的URL路由您。


回答

我的建議是,你加載你在原來的答覆爲熱媒/ L文件下載字節的文件。從這裏開始,您可以嘗試使用應用程序擴展來查找url;

舉例來說,如果你堅持使用FCIV例子,你會下載,讓相同的錯誤的東西:

The version of this file is not compatable with the version of Windows you're running. Check your computer's system information to see whether you need an x86(32-bit) or an x64 (64-bit) version of the program, and then contact the software publisher.

在仔細檢查,如果您加載此文件作爲了一個的.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。


編輯對不起,這個答案可能只適用於在Python3.X 2017年答案是有點晚了原來的問題問6年前。另外,有關文件編寫中b標誌的其他答案和評論是正確的。該文件應該以wb權限打開。

相關問題