簡體   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