如何解决ImportError: No module named packages.urllib3?

16

我在一台Ubuntu机器上运行Python 2.7.6。当我在终端中运行twill-sh(Twill是用于测试网站的浏览器)时,我遇到以下问题:

Traceback (most recent call last):
  File "dep.py", line 2, in <module>
    import twill.commands
  File "/usr/local/lib/python2.7/dist-packages/twill/__init__.py", line 52, in <module>
    from shell import TwillCommandLoop
  File "/usr/local/lib/python2.7/dist-packages/twill/shell.py", line 9, in <module>
    from twill import commands, parse, __version__
  File "/usr/local/lib/python2.7/dist-packages/twill/commands.py", line 75, in <module>
    browser = TwillBrowser()
  File "/usr/local/lib/python2.7/dist-packages/twill/browser.py", line 31, in __init__
    from requests.packages.urllib3 import connectionpool as cpl
ImportError: No module named packages.urllib3

然而,在Python控制台中我可以很好地导入urllib。可能的原因是什么?

7个回答

24
如果您已经从默认构建安装了“requests”,则可能需要进行以下操作: sudo pip install --upgrade requests 感谢@bkzland在之前的回答中的评论:
“我按照这些步骤进行了操作,遇到了相同的错误,每次都需要使用sudo pip install --upgrade来使其正常工作。- bkzland Dec 17 '15 at 12:57”
现在,我该如何在我的setup.py中将此设置为依赖项?

1
在设置中添加 requires=['requests'] - Eli
这样不会找到旧版本的requests吗?现在已经满足了依赖关系,我们会得到OP观察到的失败吗? - FlipMcF
install_requires=['requests>=2.9'] - FlipMcF

17

标准库中的urlliburllib2与第三方库urllib3有所不同。

似乎twill没有安装依赖项,因此你需要自己安装。 twill 依赖于 requests 库,该库在后台使用 urllib3。同时您还需要安装 lxmlcssselect 库。

您可以在终端上执行以下命令进行安装:

pip install requests

pip install lxml

以及

pip install cssselect


如果您正在安装,通常需要切换到 root 或在上述每个命令前加上 sudo 并在第一次输入后键入密码。 - Steve Barnes
2
是的,我已经安装了这些包。首先我安装了python-pip,然后使用pip安装其他包。错误信息没有任何变化。我甚至重新安装了Python,但没有成功。 - Joseph John
6
我按照这些步骤操作,出现了相同的错误,每次都需要使用sudo pip install --upgrade才能使它起作用。 - bkzland

8

python3

#note that requests.packages.urllib3 is just an alias for urllib3
from urllib3 import disable_warnings
from urllib3.exceptions import InsecureRequestWarning
disable_warnings(InsecureRequestWarning)

5
虽然这可能回答了问题,但您应该编辑您的答案,包括一些说明为什么这解决了问题。这使得对那些以后遇到相同问题的人更有价值。 - Kolban

5
如果您使用基于RHEL的发行版,则执行以下操作: 如果您使用基于Debian/Ubuntu的发行版,则执行以下操作: 如果您使用基于Arch Linux的发行版,则执行以下操作:

2

问题解决方案:

pip install --upgrade urllib3==1.19.1
pip install --upgrade requests

0

这里的问题是通过子依赖隐式地依赖某些东西。这种风格类似于引用类的dunder方法,因为依赖项自身的依赖关系可能会发生变化(例如,如果requests停止使用/暴露urllib3)。

您可以通过在requirements.txt/pyproject.toml文件中将其(即urllib3)表达为依赖项来明确您的依赖项,从而避免此问题。


0
应该指出,如果你犯了像我一样的初学者错误,在使用“旧”的python命令运行Python 3脚本时,也会出现这个错误,即以以下方式运行脚本:
python3 <script>.py

python <script>.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接