繁体   English   中英

如何在虚拟环境中使用请求模块?

[英]How can I use a requests module within virtual environment?

我目前正在为我的投资组合做一个项目,最近遇到了一个我无法克服的障碍。 我正在为我的项目使用虚拟环境。 我在该虚拟环境中安装了requests模块,并在尝试导入该模块时遇到以下异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/requests/__init__.py", line 43, in <module>
    import urllib3
  File "/usr/lib/python3/dist-packages/urllib3/__init__.py", line 8, in <module>
    from .connectionpool import (
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 29, in <module>
    from .connection import (
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 39, in <module>
    from .util.ssl_ import (
  File "/usr/lib/python3/dist-packages/urllib3/util/__init__.py", line 3, in <module>
    from .connection import is_connection_dropped
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 3, in <module>
    from .wait import wait_for_read
  File "/usr/lib/python3/dist-packages/urllib3/util/wait.py", line 1, in <module>
    from .selectors import (
  File "/usr/lib/python3/dist-packages/urllib3/util/selectors.py", line 14, in <module>
    from collections import namedtuple, Mapping
ImportError: cannot import name 'Mapping' from 'collections' (/usr/lib/python3.10/collections/__init__.py)

我发现这个异常的原因是旧版本的urllib3模块正在从collections模块导入Mapping对象,尽管Mapping对象当前位于collections.abc模块中。 但这并不能解决我的问题,因为在我的虚拟环境中,我有更新的urllib3模块。

$ pip list
Package            Version
------------------ -----------
asgiref            3.5.2
certifi            2022.5.18.1
charset-normalizer 2.0.12
decouple           0.0.7
Django             4.0.4
idna               3.3
pip                22.1.1
requests           2.27.1
setuptools         58.1.0
sqlparse           0.4.2
urllib3            1.26.9

不知何故,python 正在使用全局包,而不是虚拟环境中的包。 试图找出这种行为的原因,我发现当虚拟环境处于活动状态时,属性sys.prefixsys.exec_prefix应该指向虚拟环境的基本目录。 但在我的情况下,这些属性指向/usr

$ python3.10
Python 3.10.4 (main, Apr  9 2022, 21:27:52) [GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.prefix
'/usr'
>>> sys.exec_prefix
'/usr'

我不明白为什么会这样,我该如何克服。 如果有人经历过这种行为,请给我一个提示,我应该往哪个方向走。

编辑:

我启动python的步骤:

python3.10 -m venv venv/
source venv/bin/activate
pip install requests
python3.10


(venv) mikhail@HP:~/Projects/Github/python/socialize$ which python
/home/mikhail/Projects/Github/python/socialize/venv/bin/python
(venv) mikhail@HP:~/Projects/Github/python/socialize$ which python3.10
/home/mikhail/Projects/Github/python/socialize/venv/bin/python3.10
(venv) mikhail@HP:~/Projects/Github/python/socialize$ 

感谢@OneCricketeer 为我指明了正确的方向。 我的环境有问题。 我有多个带有大量软件包的 python 版本。 我认为虚拟环境会神奇地解决这个问题。 但事实并非如此。

我的解决方案是删除系统不需要的所有 python 版本(2.7、3.6),并使用 Python 版本管理系统pyenv及其虚拟环境插件 它易于使用,让我不会再弄乱我的系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM