V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Nov 2, 2018 · 3381 views
    This topic created in 2737 days ago, the information mentioned may be changed or developed.

    我在 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 replies    2018-11-02 16:43:23 +08:00
    yufeiminds
        1
    yufeiminds  
       Nov 2, 2018
    没遇到过这个问题,因为 virtualenv 的目标是创造出一个干净的隔离环境,所以理论上所有的依赖都应该在 virtualenv 里,所以我的习惯是不使用 --system-site-packages

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

    可以使用绝对路径引用 virualenv 里的 pip 重装一下依赖
    假设刚建的虚拟环境在 /home/app/venv 下,用 /home/app/venv/bin/pip 安装所有依赖包并更新
    liuyanjun0826
        2
    liuyanjun0826  
       Nov 2, 2018
    可能是目录设错了,对不起,我用 python 的时候遇到的是这样的情况
    XIVN1987
        3
    XIVN1987  
    OP
       Nov 2, 2018
    @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
       Nov 2, 2018
    现在想到一种操作难度比较低、但比较“脏”的办法:

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

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

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

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

    之所以不把 jupyter 安装到主环境下,,是因为 jupyter 依赖好多好多包,,会导致 site-packages 目录下一堆不认识的东西,,,受不了
    ltoddy
        9
    ltoddy  
       Nov 2, 2018   ❤️ 1
    我在 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
        10
    XIVN1987  
    OP
       Nov 2, 2018
    @ltoddy

    原因我在 8 楼解释了
    ltoddy
        11
    ltoddy  
       Nov 2, 2018   ❤️ 1
    @XIVN1987 你的想法就是错误的.
    XIVN1987
        12
    XIVN1987  
    OP
       Nov 2, 2018
    @ltoddy

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

    @XIVN1987 你非要这么混着玩... 忠孝不两全,两头好处都想占,看起来很美,还是苦的自己。
    ltoddy
        16
    ltoddy  
       Nov 2, 2018
    @LokiSharp pipenv 不行吧, 之前用过,不稳.
    LokiSharp
        17
    LokiSharp  
       Nov 2, 2018
    @ltoddy #16 有啥问题么?我手上做的都用它了
    ltoddy
        18
    ltoddy  
       Nov 2, 2018
    @LokiSharp 之前用过, 装第三方 lib, 装不下来. 然后就一直没用 pipenv 了.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2143 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 00:02 · PVG 08:02 · LAX 17:02 · JFK 20:02
    ♥ Do have faith in what you're doing.