Virtualenv: 在 virtualenv 的脚本中包含标准库脚本

创建于 2019-08-02  ·  22评论  ·  资料来源: pypa/virtualenv

看起来2to3目前没有被 Virtualenv 重定向。 有关用户意外的情况,请参阅https://travis-ci.community/t/2to3-command-not-found-in-virtualenv-in-bionic/4495 - 因为它通常在PATH上可用

鉴于 Py2 接近 EOL,对它的需求将会上升!


  • [X] 最小可重现示例或详细描述
$ which 2to3
/home/vmuser/.pyenv/shims/2to3

$ pyenv install 3.6.9
<...>

$ ~/.pyenv/versions/3.6.9/bin/python -m pip install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/db/9e/df208b2baad146fe3fbe750eacadd6e49bcf2f2c3c1117b7192a7b28aec4/virtualenv-16.7.2-py2.py3-none-any.whl (3.3MB)
    100% |████████████████████████████████| 3.3MB 1.3MB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-16.7.2

$ ~/.pyenv/versions/3.6.9/bin/python -m virtualenv test
Using base prefix '/home/vmuser/.pyenv/versions/3.6.9'
New python executable in /home/vmuser/test/bin/python
Installing setuptools, pip, wheel...
done.

$ . test/bin/activate

(test) $ which 2to3
/home/vmuser/.pyenv/shims/2to3

预期的行为是最后一个which返回 virtualenv 内的路径 - 与例如pythonpip相同。

  • [X] 操作系统和pip list输出
    Ubuntu 仿生桌面 x64
$ ~/.pyenv/versions/3.6.9/bin/python -m pip list
Package    Version
---------- -------
pip        18.1   
setuptools 40.6.2 
virtualenv 16.7.2 
enhancement help-wanted

最有用的评论

作为一种解决方法,您可以在您的 virtualenv 中使用python -m lib2to3 ,并具有等效的功能。

所有22条评论

进行 pyenv rehash 后是否还会出现这种情况?

在 pyenv rehash 之前或之后运行时,shim 会执行什么?

我有一种感觉,这与pyenv有关。

进行 pyenv rehash 后是否还会出现这种情况?

是的。

在 pyenv rehash 之前或之后运行时,shim 会执行什么?

由于选择system Python 没有安装2to3apt包,它说

pyenv: 2to3: command not found

The `2to3' command exists in these Python versions:
<list>

在这两种情况下。

我有一种感觉,这与pyenv有关。

pyenv无关紧要。 预期的行为是第二​​个whichpython一样返回virtualenv的垫片。 错误是virtualenv不会创建一个。 (我认为这很明显。可能不是。)

啊,好吧...激活后PATH是什么?

(我现在不在可以尝试复制它的机器上)

(test) vmuser<strong i="5">@ubuntuvm</strong>:~$ echo $PATH
/home/vmuser/test/bin:/home/vmuser/.rbenv/shims:/home/vmuser/.rbenv/bin:/home/vmuser/.pyenv/shims:/home/vmuser/.pyenv/bin:/home/vmuser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vmuser/.rvm/bin
(test) vmuser<strong i="6">@ubuntuvm</strong>:~$ ls /home/vmuser/test/bin
activate       activate_this.py  pip     python3
activate.csh   activate.xsh      pip3    python3.6
activate.fish  easy_install      pip3.6  python-config
activate.ps1   easy_install-3.6  python  wheel

作为一种解决方法,您可以在您的 virtualenv 中使用python -m lib2to3 ,并具有等效的功能。

/cc other @pypa/virtualenv-committers 如果他们认为在创建脚本时将脚本从标准库添加到 virtualenv 是个好主意。

我很矛盾。

我是-0.5。 直到现在还没有将其标记为问题的额外混乱,所以我认为这种需求很少见。 我不相信接近 EOL 的 Python 2 在这里会有所作为。 在 Windows 上的非虚拟环境中,额外的脚本也不在PATH上,因此并不像期望它们存在是通用的。

我认为这应该作为一般方法。 主机环境中的所有应用程序都应在虚拟环境级别可用。

我不相信接近 EOL 的 Python 2 在这里会有所作为。

+1

这也不是我关心的问题。 :)

在 Windows 的非虚拟环境中,额外的脚本也不在PATH

哦。 这些不是在Scripts/目录中吗? 我的理解是当前的 python.org 安装程序将该目录添加到 PATH 中,因此可以执行它们。

主机环境中的所有应用程序都应在虚拟环境级别可用。

嗯......“应用程序”在这里有点模糊 - 你指的是脚本还是其他东西? 你能澄清一下你的意思吗?

请注意,如果我们这样做,我在包含主机环境中的所有脚本方面是一个强 -1 并且在包含标准库支持的那些方面是矛盾的。

哦。 这些不是在 Scripts/ 目录中吗?

不, Scripts中的所有内容都是已安装库的入口点包装器(基本安装中的 pip、easy_install 和 wheel)。 进一步看, 2to3.py位于Tools/scripts中(以及相当混合的 60 多个其他脚本),但该目录并未放在PATH中,即使用户选择“将 Python 添加到您的 PATH”。

请注意,如果我们这样做,我在包含主机环境中的所有脚本方面是一个强 -1 并且在包含标准库支持的那些方面是矛盾的。

至少,我认为我们不应该向 PATH 添加基本安装更多的内容。 这意味着即使我们这样做,我们也不会在 Windows 上这样做。

pradyunsg 更改了标题 Include Standard Library scripts in virtualenv's bin/ Include Standard Library scripts in virtualenv's scripts 2 小时前

请注意,这是一个轻微的范围变化。 OP 只对2to3感兴趣,特别是激活 virtualenv不会影响系统2to3 。 这是否重要我无法评论(鉴于我曾主张这不会在 Windows 上发生,我在 Unix 上没有相关经验来说明我是否觉得这是一个问题)。 但是在不知道其他脚本是“标准库脚本”的情况下,我无法评论这是否很重要。

嗯, pyvenv可能是另一个“标准库脚本”,我很确定我们不想用从 virtualenv 环境运行 venv 的系统版本来隐藏它(因为这只会导致并发症没有实际利益)。

OP...感兴趣...特别是激活 virtualenv 并没有影响系统 2to3。

(我不确定这句话放在我嘴里是什么意思,可以双向解释。)

为清楚起见,我要求virtualenv2to3创建一个 shim。

(让我用预期的行为编辑原始帖子,我发现我忽略它会造成混乱。)

(让我用预期的行为编辑原始帖子)

完毕。 我还澄清了为什么用户希望它出现在PATH上。

我不确定这句话放在我嘴里是什么意思

很抱歉歪曲您的评论,感谢您的澄清! (看起来我确实正确理解了你的要求,我只是重述了一遍......)

我还澄清了为什么用户希望它在 PATH 上。

您引用的链接有点混乱。 用户似乎有一个适用于 trusty 和 xenial 的进程,但不适用于仿生。 我不清楚如果问题出在 virtualenv 中,为什么会出现这种情况。 (注意:这是题外话——无论如何,virtualenv显然不会复制2to3.py ,因此即使原始问题更微妙,关于我们是否应该进行的讨论也是有效的)。

我要求 virtualenv 为 2to3 创建一个 shim。

请注意,我们永远不会创建 shim。 我们要做的就是复制2to3.py脚本。 如果需要垫片(我认为这是 pyvenv 的事情),那么就不会是我们来处理这个问题了。

不,脚本中的所有内容都是已安装库的入口点包装器(基本安装中的 pip、easy_install 和 wheel)。

呜呜呜呜。 好的。

请注意,这是一个轻微的范围变化。

我不认为 2to3 是一个特殊的雪花——如果我们添加它,我希望有人会过来询问其余的。 我们要么完全做到这一点,要么根本不这样做。 中途卡住不是我们想要的。

(我讨厌移动用户界面)

它是“特殊的”,因为它由标准库支持,并且在标准 Linux 安装中位于PATH中。
实际上没有很多其他类似的工具。 除了2to3 ,它只有pydocidlepyvenv

$ ls ~/.pyenv/versions/3.6.9/bin
2to3          easy_install-3.6  idle3.6  pip3.6  pydoc3.6  python3.6         python3.6m         python-config  virtualenv
2to3-3.6      idle              pip      pydoc   python    python3.6-config  python3.6m-config  pyvenv
easy_install  idle3             pip3     pydoc3  python3   python3.6-gdb.py  python3-config     pyvenv-3.6

(还有python-config已经被重定向)

啊,感谢@native-api 的澄清! 非常感激。 随着@pfmoore对这不是Windows 问题的解释,这有助于我的理解。 :)

我仍然对包含它感到矛盾。

除了 2to3 之外,只有 pydoc、idle 和 pyvenv

我很想知道是谁选择了这份名单。 它是专门的pyvenv吗? Ubuntu(Windows 上的 bash,以及安装了 python3 的 docker 映像)似乎默认没有 2to3,尽管 Python docker 映像具有您提到的相同二进制文件(加上 pip、easy_install 和 wheel,它们来自已安装的包)。 似乎有点依赖于分布:-( 至少相关二进制文件的列表似乎是一致的。

顺便说一句,正如我上面所说,即使我们做了这个改变,我强烈建议不要包括 pyvenv。

Ubuntu(Windows 上的 bash,以及安装了 python3 的 docker 映像)默认情况下似乎没有 2to3

那是因为在 Ubuntu 中, 2to3被移动到一个单独的包中:

$ apt-file search 2to3 | grep -E '/2to3[^/]*$'
2to3: /usr/bin/2to3
<...>
python2.7: /usr/bin/2to3-2.7
<...>

通过“标准 Linux 安装”,我指的是 Python 的 Linux 构建脚本所固有的逻辑,没有发行版的干预——例如,如果您从源代码安装(这就是pyenv所做的)。

我可以接受这个并将尝试解决这个问题。

请注意,这将取代我们当前将 pydoc 添加为激活脚本的一部分的技巧。

此页面是否有帮助?
0 / 5 - 0 等级