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 · 2761 次点击
    这是一个创建于 2246 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 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:\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
       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   ·   实用小工具   ·   3227 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:00 · PVG 20:00 · LAX 04:00 · JFK 07:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.