如果 Python 主环境下和 vritualenv 下各有 package 的一部分该怎么办?? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
XIVN1987
V2EX    Python

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

  •  
  •   XIVN1987 2018-11-02 10:02:15 +08:00 3094 次点击
    这是一个创建于 2541 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 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 包下去找一下也行,,

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

    18 条回复    2018-11-02 16:43:23 +08:00
    yufeiminds
        1
    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
        2
    liuyanjun0826  
       2018-11-02 10:24:56 +08:00
    可能是目录设错了,对不起,我用 python 的时候遇到的是这样的情况
    XIVN1987
        3
    XIVN1987  
    OP
       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
        4
    XIVN1987  
    OP
       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
        5
    QQ2171775959  
       2018-11-02 10:32:13 +08:00
    没有遇到过这种情况,我也来学习一下。
    likuku
        6
    likuku  
       2018-11-02 10:33:17 +08:00
    主环境啥都不装,只用 virtualenv,
    可能因为我需求简单... 只需要在 命令行下跑点东西,写 py 也只用 atom 这种编辑器。
    vimiix
        7
    vimiix  
       2018-11-02 10:36:16 +08:00
    玩 python 建议还是每个项目下的依赖包各装一份,不需要的时候直接 rm -rf venv 就好了。混用感觉是在自己挖坑跳呀
    XIVN1987
        8
    XIVN1987  
    OP
       2018-11-02 10:42:01 +08:00
    @vimiix
    我只是想把 numpy、pandas、matplotlib 这些常用的库安装到主环境下,,然后把 jupyter 安装到虚拟环境 venv 下,,然后再虚拟环境 venv 下也能使用主环境下的 numpy、pandas、matplotlib,,

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

    之所以不把 jupyter 安装到主环境下,,是因为 jupyter 依赖好多好多包,,会导致 site-packages 目录下一堆不认识的东西,,,受不了
    ltoddy
        9
    ltoddy  
       2018-11-02 11:02:30 +08:00   1
    我在 D:\Pyton27 下安装了 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
        10
    XIVN1987  
    OP
       2018-11-02 11:04:23 +08:00
    @ltoddy

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

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

    @XIVN1987 你非要这么混着玩... 忠孝不两全,两头好处都想占,看起来很美,还是苦的自己。
    ltoddy
        16
    ltoddy  
       2018-11-02 15:04:46 +08:00
    @LokiSharp pipenv 不行吧, 之前用过,不稳.
    LokiSharp
        17
    LokiSharp  
       2018-11-02 15:08:16 +08:00
    @ltoddy #16 有啥问题么?我手上做的都用它了
    ltoddy
        18
    ltoddy  
       2018-11-02 16:43:23 +08:00
    @LokiSharp 之前用过, 装第三方 lib, 装不下来. 然后就一直没用 pipenv 了.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2759 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 11:18 PVG 19:18 LAX 04:18 JFK 07:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86