排序 sys.path:首先是 virtualenv,然后是 /usr

2024-04-26

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

我用以下命令创建 virtualenv--system-site-packages

The 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?

为什么我使用系统站点包

似乎没有直接的方法可以使全局站点包中的单个库在 virtualenv 中可用。看这个问题:使全局站点包中的一些模块在 virtualenv 中可用 https://stackoverflow.com/questions/19228198/make-some-modules-from-global-site-packages-available-in-virtualenv

有些软件包(例如 python-gtk)很难安装在 virtualenv 中。


讨论后编辑:

“我希望 virtualenv (/usr...) 之外的所有路径都低于 virtualenv 的路径。 [...] 需要对其进行排序。”

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

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

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

原始答案(一般来说仍然有效):

您不想过多地阐述您的需求和应用场景,因此我提供了一个更笼统的答案:您可能需要过度思考您的方法,并且也许不期望virtualenv彻底解决您的问题。

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

在很多场景下virtualenv服务于一个伟大的目的并且做得非常好!当然,它对我帮助很大,尤其是出于开发目的。在其他场景中,它要么不是一个完整的解决方案,甚至是一个糟糕的解决方案。

所以,现在我看到有一些不同的选择:

  1. 使用 virtualenv,但控制那些需要更改的内容。例如修改sys.path从您的包裹中before进行一定的导入。虽然有些人可能认为这“不干净”,但它确实是一种有效且可靠地控制目录搜索顺序的非常快速的方法。sys.path.insert(1, foo)实际上是由many包和测试环境。这一点也不罕见。这种方法只需一分钟的工作就可以为您提供一个可行的解决方案。试一试!
  2. 如果您认为您的案例中的 virtualenv 的行为与记录的不符或明显显示出错误行为,那么请将您的发现报告给项目。他们一定会感谢您简洁的反馈。
  3. 如果您认为 virtualenv 无法提供您的应用程序案例所需的隔离或控制级别,您可能需要考虑其他选项,例如 Docker 或 Vagrant,或全功能虚拟机。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序 sys.path:首先是 virtualenv,然后是 /usr 的相关文章

  • ipdb 和 pdb++ 之间的区别?

    Python 有一个名为 pdb 的默认调试器 但社区创建了一些替代品 其中两个是ipdb https github com gotcha ipdb and pdb https github com pdbpp pdbpp 它们似乎迎合了相
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • Pyenv 无法在 Cygwin 上安装 python: ModuleNotFoundError: No module named '_ctypes'

    我正在尝试设置 Cygwin 环境以使用 pyenv 来管理 python 版本 我没有管理员权限 所以我使用以下命令运行设置 no admin flag 我使用 Cygwin 包管理器应用程序解决了一些依赖关系 但我被困在了这一点上 Mo
  • 帮助需要在可选条件下编写正则表达式[关闭]

    我有一个日志文件包含如下内容 log Using data from yyyy mm dd 2011 8 3 0 files queued for scanning Warning E test H ndler pdf File not F
  • 在 Python 3 中动态导入模块的问题

    我遇到的情况是 在我的 Python 3 项目中 在运行时必须包含某些模块 我在用着importlib import module为了这 第二次更新 我确实找到了一种方法来做一些接近我想要的事情 一些额外的代码可能会使我的一些链接稍微偏离一
  • 有条件填写 pandas 数据框

    我有一个数据框df列中包含浮点值A 我想添加另一列B这样 B 0 A 0 for i gt 0 B i if np isnan A i then A i else Step3 B i if abs B i 1 A i B i 1 lt 0
  • 可移植的非关系数据库

    我想尝试 尝试非关系数据库 最好的解决方案是 便携式 这意味着它不需要安装 理想情况下 只需将目录复制粘贴到某个地方即可使其工作 我不介意第一次使用时是否需要编辑一些配置文件或运行配置工具 可从 python 访问 适用于 Windows
  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • Docker OSX:从容器连接到主机端口

    我的问题 我正在尝试在 docker 容器上安装 Flask 应用程序 该应用程序需要通过以下方式安装一些软件包pip https pip pypa io en stable 我在端口 9000 上使用本地 主机 而不是容器 pip 存储库
  • 使用 Python 的文本中的词频但忽略停用词

    这给了我文本中单词的频率 fullWords re findall r w allText d defaultdict int for word in fullWords d word 1 finalFreq sorted d iterit
  • Selenium Webdriver - Python - leboncoin - pb 选择带重音的按钮

    我正在尝试在以下网站上自动填写表格 https www leboncoin fr https www leboncoin fr 我用 Selenium IDE 录制了一个脚本 我有一个通过单击 Se 连接器 按钮并填写我的密码和用户名来自动
  • Pandas Pivot_Table :非数字值的行计算百分比

    这是我在数据框 df 中的数据 Document Name Time SPS2315511 A 1 HOUR SPS2315512 B 1 2 HOUR SPS2315513 C 2 3 HOUR SPS2315514 C 1 HOUR S
  • 向 Python 2.6 添加 SSL 支持

    我尝试使用sslPython 2 6 中的模块 但我被告知它不可用 安装OpenSSL后 我重新编译2 6 但问题仍然存在 有什么建议么 您安装了 OpenSSL 开发库吗 我必须安装openssl devel例如 在 CentOS 上 在
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • 如何从数据框的单元格中获取值?

    我构建了一个条件 从我的数据框中提取一行 d2 df df l ext l ext df item item df wn wn df wd 1 现在我想从特定列中获取一个值 val d2 col name 但结果 我得到一个包含一行和一列
  • 请求response.iter_content()获取不完整的文件(1024MB而不是1.5GB)?

    您好 我一直在使用此代码片段从网站下载文件 到目前为止 小于 1GB 的文件都很好 但我注意到 1 5GB 文件不完整 s is requests session object r s get fileUrl headers headers
  • 网页抓取 - 如何识别网页上的主要内容

    给定一个新闻文章网页 来自任何主要新闻来源 例如时报或彭博社 我想识别该页面上的主要文章内容 并丢弃其他杂项元素 例如广告 菜单 侧边栏 用户评论 在大多数主要新闻网站上都可以使用的通用方法是什么 有哪些好的数据挖掘工具或库 最好是基于Py
  • 从 Python 中编译的正则表达式中提取命名组正则表达式模式

    我有一个 Python 正则表达式 其中包含多个命名组 但是 如果先前的组已匹配 则可能会错过与一组匹配的模式 因为似乎不允许重叠 举个例子 import re myText sgasgAAAaoasgosaegnsBBBausgisego
  • 在 Tensorflow 2.0 中的简单 LSTM 层之上添加 Attention

    我有一个由一个 LSTM 和两个 Dense 层组成的简单网络 如下所示 model tf keras Sequential model add layers LSTM 20 input shape train X shape 1 trai
  • 如何动态创建 Luigi 任务

    我正在为 Luigi Tasks 构建一个包装器 但遇到了一个障碍Register http luigi readthedocs io en stable modules luigi task register html Register该

随机推荐