gpt4 book ai didi

python - 排序 sys.path : first virtualenv, then/usr

转载 作者:太空狗 更新时间:2023-10-30 01:07:46 25 4
gpt4 key购买 nike

为什么 sys.path 在我的 virtualenv 目录之前包含 /usr/...

我使用 --system-site-packages 创建 virtualenv

sys.path 目前看起来像这样:

/home/my-virtualenv/src/foo
/usr/lib/python2.7/site-packages <--- /usr paths should be below
/usr/lib64/python2.7/site-packages
/home/my-virtualenv/lib/python27.zip
/home/my-virtualenv/lib64/python2.7
/home/my-virtualenv/lib64/python2.7/plat-linux2
/home/my-virtualenv/lib64/python2.7/lib-tk
/home/my-virtualenv/lib64/python2.7/lib-old
/home/my-virtualenv/lib64/python2.7/lib-dynload
/usr/lib64/python2.7
/usr/lib/python2.7
/usr/lib64/python2.7/lib-tk
/home/my-virtualenv/lib/python2.7/site-packages

我希望我的 virtualenv (/usr...) 之外的所有路径都在 virtualenv 的路径之下。

否则疯狂的事情就会发生:我用 pip 安装了一个包。 Pip 告诉我新版本已安装 (pip freeze | grep -i ...) 但导入确实使用了来自 /usr/lib/python2.7/site-packages 的版本

我不能在我的上下文中使用 --no-site-packages

有没有办法对 sys.path 进行排序?

为什么我使用 system-site-packages

似乎没有直接的方法可以从 virtualenv 中提供全局站 pip 包中的单个库。看到这个问题: make some modules from global site-packages available in virtualenv

像 python-gtk 这样的包很难安装在 virtualenv 中。

最佳答案

讨论后编辑:

"I want all paths outside my virtualenv (/usr...) to be below the paths of the virtualenv. [...] It needs to be sorted."

然后,只需在第一次导入发生之前对您的 sys.path 进行排序。给定与您的 virtalenv 位置相对应的特定路径 prefix,这种方法可能就足够了:

sys.path = sorted(sys.path, key=lambda x: x.startswith(prefix), reverse=True)

sorted() 的排序行为是稳定的:对于具有相同排序键的项目,将保留原始顺序。这里只使用了两个排序键:TrueFalse。你需要想出一个可靠的方法来设置你的prefix(你可能想硬编码它,或者根据当前工作目录来确定它,我相信你找到了方法)。

原始答案(仍然有效,一般而言):

你不想过多地阐述你的需求和应用场景,所以我提供一个更笼统的答案:你可能需要过度思考你的方法,也许不要指望 virtualenv 能完全解决你的问题问题。

在某些情况下,virtualenv 并不是完美的解决方案。它一种妥协,这篇文章详尽地描述了这种妥协的一面:https://pythonrants.wordpress.com/2013/12/06/why-i-hate-virtualenv-and-pip/

在很多情况下,virtualenv 都有很好的用途,而且做得很好!当然,它对我帮助很大,尤其是在开发方面。在其他场景下,它要么不是一个完整的解决方案,要么是一个糟糕的解决方案。

所以,现在我看到了几个不同的选项:

  1. 使用 virtualenv,但控制那些你需要改变的东西。例如,在您的包 执行特定导入之前修改sys.path。虽然有些人可能认为这“不干净”,但它肯定是一种高效可靠地控制目录搜索顺序的非常快捷的方法。 sys.path.insert(1, foo) 实际上被许多 包和测试环境使用。这一 pip 也不罕见。这种方法可能会在一分钟的工作后为您提供一个可行的解决方案。试一试!
  2. 如果您认为在您的案例中 virtualenv 的行为与记录不符或明显显示错误行为,请将您的发现报告给项目。他们一定会感谢您的简明反馈。
  3. 如果您认为 virtualenv 无法提供您在应用案例中所需的隔离或控制级别,您可能需要查看其他选项,例如 Docker 或 Vagrant,或功能齐全的虚拟机。

关于python - 排序 sys.path : first virtualenv, then/usr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com