【问题标题】:Ubuntu 21.04, Virtualenv and its configuration of PythonUbuntu 21.04、Virtualenv 及其 Python 配置
【发布时间】:2021-12-16 23:43:07
【问题描述】:

编辑:

  • 除了下面列出的行为之外,基于 Python3.10 的环境似乎忽略了使用 pip -e 选项安装的软件包(开发模式)。
  • 具体来说,在开发模式下安装的包没有在pip freeze 中列出(它在基于Python3.9 的虚拟环境中列出)并且一个简单的import <package_name> 失败。如果包安装正常(即不是处于开发模式)一切都按预期工作。

我正在使用virtualenv 创建一个基于 Python 3.10 的虚拟环境。虽然 virtualenv 完成时没有出现错误并且似乎已激活,但它仍然无法获取自己的 Python除非手动设置了 PYTHONPATH 环境变量。

我不确定我所面临的情况是由于 Ubuntu 合并 Python 的方式,还是由于 virtualenv 设置环境以获取本地解释器的方式。以下是我到目前为止收集到的内容:

  1. 我的基本系统是 Ubuntu 21.04。它有自己的 Python 3 (Python3.9.5) 安装,除了使用 apt 安装 python3-virtualenv 包外,我根本没有接触过。

  2. 在 Python 3.10 中,我安装了 python3.10-dev 包,并以通常的方式继续创建虚拟环境:

    1. > virtualenv -p python3.10 the_env/
    2. > source the_env/bin/activate
  3. 虽然到目前为止看起来还不错,但此环境没有关于其自己的site-packages 目录的任何信息。甚至不是virtualenv 应该创建的包含pip 的那个。在这个安装中,如果你尝试> pip --version 你只会得到一个错误 pip 包不存在(pip“可执行”位置被正确拾取,但由于解释器对其site-packages 一无所知,因此无法正确启动 pip)。

长话短说,我创建了两个环境,一个基于 Python3.9(完美运行),一个基于 Python3.10(无法运行),并在每个中做了一个非常简单的测试> 环境:

  • > python -m site
    • 在 Python3.9 环境中,sys.path包含一条通往该特定环境的site-packages 的路径
    • 在 Python3.10 环境中,sys.path 包含该特定路径,但仍包含您希望找到的典型路径(例如,指向解释器本身和顶级环境目录但不是指向site-packages 位置的特定路径。

在此之后,我手动定义了一个PYTHONPATH,然后为该特定环境激活了精确指向site-packages 的环境,并且一切都按预期工作。

怀疑这可能与我的系统的 Python 是 3.9 的事实有关,这意味着 USER_SITE 变量 有效,而在Python3.10,它不是(因为我没有用它,这只是我正在创建的一个虚拟环境)。所以,我怀疑这可能会偏离site module determines where things are 的方式。

由于我不确定,我想问以下问题:

  1. 这可能与 Ubuntu 处理 Python 安装的方式有关吗?可能只是在虚拟环境中产生了这个小问题?

  2. 问题可能出在没有明确指定PYTHONPATHvirtualenv 上吗?

  3. 这种行为可能是site 模块的极端情况吗?

【问题讨论】:

    标签: python-3.x ubuntu pip virtualenv


    【解决方案1】:

    对我有用的是从源代码安装。源码解压后,作为总结:

    $ ./configure --enable-optimizations --with-ensurepip=install --prefix=/path/to/install/to/
    $ make -j
    $ make test
    $ make install
    $ /path/to/install/to/bin/python3.10 -m venv /path/to/test
    $ source /path/to/test/bin/activate
    $ pip list
    Package    Version
    ---------- -------
    pip        21.2.4
    setuptools 58.1.0
    WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
    You should consider upgrading via the '/path/to/test/bin/python3.10 -m pip install --upgrade pip' command.
    $ python -m pip install --upgrade pip
    [...]
    $ pip list
    Package    Version
    ---------- -------
    pip        21.3.1
    setuptools 58.1.0
    

    编辑

    如下所述,我相信上面的过程之所以能正常工作,是因为从源代码构建和安装 Python 时,安装是正确的,我怀疑 Ubuntu 21.04 中的 3.10 安装不是正确的。

    为了不冒把事情搞砸的风险,我从源目录下的某个地方安装了 Python,而且我也没有永久修改 PATH。

    设置$PATH:/path/to/install/to/bin 的路径应该没问题,无论是永久设置,还是仅在运行mkvirtualenv 时。

    这样做,我的新安装甚至似乎与我系统的virtualenvwrapper 无缝集成。

    我自己并不真正需要处于 Python 前沿,但如果我这样做了,我肯定会通过使用上述过程使自己独立于 Ubuntu 的最新开发。

    顺便说一句,如果我直接在从源代码构建的 Python 安装中更新 pip,那么当我安装新的虚拟环境时,我将不再收到有关旧的 pip(见上文)的消息。

    编辑 2

    向 Ubuntu 报告的错误: https://bugs.launchpad.net/ubuntu/+source/python3.10/+bug/1955742

    编辑 3

    另外,由于 Ubuntu 21.04 将在一个月左右结束生命,升级到 21.10 真的很有意义。我刚刚尝试过,似乎 Python 3.10 虚拟环境在该版本中运行良好。

    【讨论】:

    • 您好,感谢您的回复。你能详细说明你的答案吗?我不明白“从源代码安装”(对于 Python)如何有助于能够使用系统上安装的 Python 版本以外的 Python 版本创建虚拟环境(?)。
    • @A_A,正如您在我的回答中看到的那样,我通过使用 venv 库作为脚本来做到这一点,来自新安装的 Python,从源代码构建。它只是工作,我猜只是因为它安装正确,不像 Ubuntu 21.04 上的 Python 3.10(仍在猜测)。我通常使用virtualenvwrapper,上面的解决方案并不能与我现有的实例无缝集成。由于这也是一个 Python 模块,我想我可以通过将它安装在从源代码构建的 Python 环境中来解决这个问题。我实际上并不严格需要 Python 3.10,所以我将等待官方的 Ubuntu 解决方案。
    • 查看我上面的编辑,它比我之前的评论更新。所以基本上,从源代码构建 Python,仔细更新你的PATH,它就可以工作了。向 Ubuntu 报告错误也是一个想法。
    • 我现在也向 Ubuntu 报告了这个错误(参见编辑 2)。
    • 参见编辑 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2021-07-28
    • 2015-07-08
    • 2022-09-23
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多