Python 2.7 urllib.urlretrieve 下载 Dropbox 文件时出错

Python 2.7 error downloading Dropbox file by urllib.urlretrieve

我使用的代码(不要介意图片,这是测试代码):

import urllib
urllib.urlretrieve('https%3A//dl.dropboxusercontent.com/u/95587456/Evenimente/1.jpg','/storage/emulated/0/Temp/1.jpg')

我试图通过其 public 保管箱下载图像 link,结果弹出此错误:

I/python  ( 3750):  Traceback (most recent call last):
I/python  ( 3750):    File "/home/cristi/Desktop/AplicatieMinister/.buildozer/android/app/main.py", line 102, in <module>
"/home/cristi/Desktop/AplicatieMinister/.buildozer/android/app/main.py", line 63, in IncarcaAfise
I/python  ( 3750):    File "/home/cristi/Desktop/AplicatieMinister/.buildozer/android/platform/python-for-android/build/python-install/lib/python2.7/urllib.py", line 91, in urlretrieve
I/python  ( 3750):    File "/home/cristi/Desktop/AplicatieMinister/.buildozer/android/platform/python-for-android/build/python-install/lib/python2.7/urllib.py", line 237, in retrieve
I/python  ( 3750):    File "/home/cristi/Desktop/AplicatieMinister/.buildozer/android/platform/python-for-android/build/python-install/lib/python2.7/urllib.py", line 205, in open
I/python  ( 3750):    File "/home/cristi/Desktop/AplicatieMinister/.buildozer/android/platform/python-for-android/build/python-install/lib/python2.7/urllib.py", line 461, in open_file
I/python  ( 3750):    File "/home/cristi/Desktop/AplicatieMinister/.buildozer/android/platform/python-for-android/build/python-install/lib/python2.7/urllib.py", line 475, in open_local_file
I/python  ( 3750):  IOError: [Errno 2] No such file or directory: 'https://dl.dropboxusercontent.com/u/95587456/Evenimente/1.jpg'

运行 Windows 上的这段代码没有问题(它下载了文件),但在 android 上(通过 buildozer 将其编译为 APK 后)它给出了之前的错误.

我尝试在 link 的末尾添加 ?dl=1 和 ?dl=0,结果还是出现了同样的错误。此外,我在 link 上尝试了 urllib.quote(并将“$3A”替换为“:”),但它仍然出现此错误。

关于 urllib 和 urlretrieve 在 android 下的工作方式,我是否忽略了什么?

此外,如果有帮助,Kivy/buildozer 已用于此开发。

根据堆栈跟踪,urllib.urlretrieve 似乎认为您的 Dropbox URL 是本地文件路径,而不是 Internet URL,并试图打开它像这样。 (即,它尝试使用 open_local_file。)这应该是根据 URL 的格式自动确定的,但这显然与您试图转义“:”的尝试混淆了,这应该没必要。

你的示例代码对我来说实际上以同样的方式失败,只是在 Python 解释器中:

In [1]: import urllib

In [2]: urllib.urlretrieve('https%3A//dl.dropboxusercontent.com/u/95587456/Evenimente/1.jpg','./1.jpg')
...
IOError: [Errno 2] No such file or directory: 'https://dl.dropboxusercontent.com/u/95587456/Evenimente/1.jpg'

既然如此,您确定运行您认为是您在不同平台上使用的代码吗?

只需将 URL 恢复正常对我来说就可以了:

In [1]: import urllib

In [2]: urllib.urlretrieve('https://dl.dropboxusercontent.com/u/95587456/Evenimente/1.jpg','./1.jpg')
Out[2]: ('./1.jpg', <httplib.HTTPMessage instance at 0x10da6d878>)

(我也修改了第二个参数,让它在我的电脑上运行,但那是无关的。)