【问题标题】:On WSL2 `pip install virtualenv` comand hangs for too long在 WSL2 上,“pip install virtualenv”命令挂起时间过长
【发布时间】:2021-09-02 02:26:59
【问题描述】:

在运行 Ubuntu 20.04 的 WSL2 下,我尝试使用运行 pip install virtualenv 的 pip 安装 virtualenv,但该命令只是挂起不打印任何内容。

我终止了它并按照here 的建议使用python3 -v -m pip install virtualenv 再次运行它,它挂在import 'keyring.backends.OS_X' 行:

[...]
# /usr/lib/python3/dist-packages/keyring/backends/__pycache__/_OS_X_API.cpython-38.pyc matches /usr/lib/python3/dist-packages/keyring/backends/_OS_X_API.py
# code object from '/usr/lib/python3/dist-packages/keyring/backends/__pycache__/_OS_X_API.cpython-38.pyc'
# destroy keyring.backends._OS_X_API
import 'keyring.backends.OS_X' # <_frozen_importlib_external.SourceFileLoader object at 0x7fa66c4b4610>

我尝试按照here 的回答运行python -m pip install some_package_you_want,但出现了同样的问题。

另外,我尝试按照here 的建议导出PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring 环境变量,但不幸的是它也没有解决问题。

编辑:python3 -v -m pip install virtualenv 命令在挂起大约 5 分钟后最终成功。

EDIT2:我认为问题在于 WSL2 太慢,正如 here 所评论的那样。最终我用sudo apt-get install python3-venv 安装了virtualenv (venv) 并用python3 -v -m venv venv 命令激活了虚拟环境,现在在import 'argparse' # &lt;_frozen_importlib_external.SourceFileLoader object at 0x7ff1bc5f1c40&gt; 线上出现了类似的挂起问题,在这里挂了大约2 分钟。这支持 WSL2 缓慢问题。

【问题讨论】:

    标签: python pip windows-subsystem-for-linux python-keyring


    【解决方案1】:

    是否设置了DISPLAY 环境变量?如果是这样,在运行 pip 之前先清除它对我有用:

    export DISPLAY=
    pip install <packagename>
    

    (或者,作为单行:DISPLAY= pip install &lt;packagename&gt;

    【讨论】:

    • 不幸的是,目前我无法重现该问题,因此我将不接受答案。也许有人觉得它有用。
    • 也为我工作
    • @IvanVnucec 您无法重新创建此问题,可能是因为您的 X 服务器正在运行。我可以通过清除 DISPLAY 或在 DISPLAY 指向的位置启动 X 服务器来解决此问题。
    【解决方案2】:

    我将系统上的问题追溯到this line

    import keyring
    

    Importing keyring taking very long in WSL2 是一个已知问题,即fixed in keyring versions ≥ 21.6.0

    因此,将keyring 更新到最新版本应该可以解决问题:

    pip install -U keyring
    

    或者说

    DISPLAY= pip install -U keyring
    

    【讨论】:

      【解决方案3】:

      我对日志进行了一些挖掘,对显示值集和显示值空运行python3 -v -m pip install packageName 命令。如果显示值为空,会发生以下情况:

      import 'jeepney.bus' # <_frozen_importlib_external.SourceFileLoader object at 0x7f8ee337f910>
      # /home/shouv/.local/lib/python3.8/site-packages/jeepney/__pycache__/bus_messages.cpython-38.pyc matches /home/shouv/.local/lib/python3.8/site-packages/jeepney/bus_messages.py
      # code object from '/home/shouv/.local/lib/python3.8/site-packages/jeepney/__pycache__/bus_messages.cpython-38.pyc'
      # /home/shouv/.local/lib/python3.8/site-packages/jeepney/__pycache__/wrappers.cpython-38.pyc matches /home/shouv/.local/lib/python3.8/site-packages/jeepney/wrappers.py
      # code object from '/home/shouv/.local/lib/python3.8/site-packages/jeepney/__pycache__/wrappers.cpython-38.pyc'
      Collecting thing
        Downloading thing-0.3.3.tar.gz (12 kB)
      Collecting mysql-python
        Downloading MySQL-python-1.2.5.zip (108 kB)
      import 'jeepney.wrappers' # <_frozen_importlib_external.SourceFileLoader object at 0x7f8ee338baf0>
      

      但是对于设置的显示值,包的收集不会发生,它直接从导入总线到包装器。

      Jeepney 是 D-Bus 的纯 Python 接口,D-Bus 是桌面 Linux 上的进程间通信协议。如果设置了 DISPLAY 值,它与 wsl2 的交互可能会有点有趣,这可能导致了问题。 DISPLAY 值设置为空时完美运行。

      【讨论】:

      • 我看不出你的答案与之前的答案有什么不同——你的解决方案是一样的——取消设置显示。这个问题并不是吉普尼特有的。这是pip 尝试使用密钥环的问题,它也使用dbus。一旦您有足够的代表,这可能应该是对现有答案的评论。
      猜你喜欢
      • 1970-01-01
      • 2017-02-26
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多