如果 Python 主环境下和 vritualenv 下各有 package 的一部分该怎么办??

2018-11-02 10:02:15 +08:00
 XIVN1987

我在 D:\Python27 下安装了 Python,并在其中安装了 matplotlib,而 matplotlib 又依赖 backports.functools_lru_cache,所以在 D:\Python27\Lib\site-packages 目录下有 backports 包

然后我又用 virtualenv --system-site-packages venv 在 D:\Python27\venv 目录下生成了一个虚拟环境,然后在此虚拟环境下安装了 jupyter,而 jupyter 又依赖 backports.shutil_get_terminal_size,所以在 D:\Python27\venv\Lib\site-packages 目录下也有 backports 包

而且这两个 backports 包的内容又不一样,,

装完之后我启动 D:\Python27\venv 下的 iPython 结果它告诉我在 import matplotlib 时发生 from backports.functools_lru_cache import lru_cache 错误,,backports 下没有 functools_lru_cache

我猜测两个地方同时有 backports 包时,虚拟环境优先导入虚拟环境下的 backports,虚拟环境下的 backports 确实没有 functools_lru_cache

所以我就想在虚拟环境下用 pip install backports.functools_lru_cache 也安装 functools_lru_cache,,可是 pip 告诉我已经有 functools_lru_cache 了,,不让装,,我猜测是因为 pip 检测到了主环境下已经安装了 backports.functools_lru_cache,所以就不让我在虚拟环境下安装了

我又想了两种可能的办法:

1、把主环境下的 backports.functools_lru_cache 给卸载了,,在虚拟环境下安装,,可这样的话就只能在虚拟环境下才能使用 matplotlib 库了,,这肯定不行

2、安装虚拟环境时去掉--system-site-packages,,可这样的话虚拟环境和主环境下就得各安装一个 matplotlib 才能两个环境都有 matplotlib 用,,

我觉得出现这种状况的主要原因是,backports.functools_lru_cache 和 backports.shutil_get_terminal_size 这两个包明明不一样,,安装后的包名却都叫 backports,,其实在这种情况下,如果虚拟环境下的 backports 包下找不到 functools_lru_cache,,python 能主动再去主环境的 backports 包下去找一下也行,,

所以,,现在卡死了,,请问有没有遇到类似问题的??对这种情况官方有没有什么解决办法??

2732 次点击
所在节点    Python
18 条回复
yufeiminds
2018-11-02 10:13:48 +08:00
没遇到过这个问题,因为 virtualenv 的目标是创造出一个干净的隔离环境,所以理论上所有的依赖都应该在 virtualenv 里,所以我的习惯是不使用 --system-site-packages

猜测:你使用的 pip 不是 virtualenv 里的

可以使用绝对路径引用 virualenv 里的 pip 重装一下依赖
假设刚建的虚拟环境在 /home/app/venv 下,用 /home/app/venv/bin/pip 安装所有依赖包并更新
liuyanjun0826
2018-11-02 10:24:56 +08:00
可能是目录设错了,对不起,我用 python 的时候遇到的是这样的情况
XIVN1987
2018-11-02 10:26:53 +08:00
@yufeiminds
我用的是 virtualenv 里的 pip,但是因为建虚拟环境时使用了--system-site-packages,所以即使用 virtualenv 里的 pip,它也会检查主环境里有没有要安装的 package

至于你说创建虚拟环境时不使用--system-site-packages,,这确实可以解决问题,,不过这样的话 numpy、scipy、pandas、matplotlib、sympy、scikit-learn 这些包我都要在主环境和虚拟环境下各装一份,,

还有一种更彻底的方法,不建虚拟环境,,直接把 jupyter 安装在主环境下,,可是 jupyter 依赖的包有 50 个以上,,把主环境的 site-packages 目录都给污染了,,感觉也不好
XIVN1987
2018-11-02 10:31:00 +08:00
现在想到一种操作难度比较低、但比较“脏”的办法:

手动把 D:\Python27\Lib\site-packages\backports 目录下的 functools_lru_cache.py 文件拷贝到 D:\Python27\venv\Lib\site-packages\backports 目录下

已经测试,,问题确实解决了

不过感觉这种方法真的不太好,,
QQ2171775959
2018-11-02 10:32:13 +08:00
没有遇到过这种情况,我也来学习一下。
likuku
2018-11-02 10:33:17 +08:00
主环境啥都不装,只用 virtualenv,
可能因为我需求简单... 只需要在 命令行下跑点东西,写 py 也只用 atom 这种编辑器。
vimiix
2018-11-02 10:36:16 +08:00
玩 python 建议还是每个项目下的依赖包各装一份,不需要的时候直接 rm -rf venv 就好了。混用感觉是在自己挖坑跳呀
XIVN1987
2018-11-02 10:42:01 +08:00
@vimiix
我只是想把 numpy、pandas、matplotlib 这些常用的库安装到主环境下,,然后把 jupyter 安装到虚拟环境 venv 下,,然后再虚拟环境 venv 下也能使用主环境下的 numpy、pandas、matplotlib,,

我想我这种用法还是比较常规的

之所以不把 jupyter 安装到主环境下,,是因为 jupyter 依赖好多好多包,,会导致 site-packages 目录下一堆不认识的东西,,,受不了
ltoddy
2018-11-02 11:02:30 +08:00
我在 D:\Python27 下安装了 Python
装完之后我启动 D:\Python27\venv

这是你文中的原话, 我不明白你为什么这么做.

正确的做法不应该是当你想要新做一个项目的时候:

$ mkdir new-project
$ cd new-project
$ virtualenv venv
$ source ./venv/bin/active

然后你 pip 安装了一堆第三方 lib 之后,

env$ pip freeze > requirements.txt

这个样子.

假设你把这个项目开源.

那么别人也可以下载了你的项目之后, 先构建一个虚拟环境, 然后在激活, 然后 pip install -r requirements.txt
XIVN1987
2018-11-02 11:04:23 +08:00
@ltoddy

原因我在 8 楼解释了
ltoddy
2018-11-02 11:27:23 +08:00
@XIVN1987 你的想法就是错误的.
XIVN1987
2018-11-02 11:37:52 +08:00
@ltoddy

virtualenv 的--system-site-packages 选项不就是为我这种用法设计的吗?
LokiSharp
2018-11-02 11:46:23 +08:00
pipenv 路过
jmc891205
2018-11-02 12:04:28 +08:00
不太懂 lz 为什么不愿意在主环境和虚拟环境里把 numpy 什么的各装一份 难道是硬盘比较小?
说实话有的时候同一个包 在主环境和虚拟环境里需要的版本可能不一样 所以各装一份的好处是显而易见的
likuku
2018-11-02 12:14:12 +08:00
#9 最佳实践

@XIVN1987 你非要这么混着玩... 忠孝不两全,两头好处都想占,看起来很美,还是苦的自己。
ltoddy
2018-11-02 15:04:46 +08:00
@LokiSharp pipenv 不行吧, 之前用过,不稳.
LokiSharp
2018-11-02 15:08:16 +08:00
@ltoddy #16 有啥问题么?我手上做的都用它了
ltoddy
2018-11-02 16:43:23 +08:00
@LokiSharp 之前用过, 装第三方 lib, 装不下来. 然后就一直没用 pipenv 了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/503662

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX