17

我一直在寻找答案,但没有找到答案。我有一个虚拟环境目录,一个带有 req.txt 的项目目录。当我运行 pip -r req.txt 时,它会安装一些来自 github(源代码)的应用程序和一些来自 pypi 的应用程序。在虚拟 evn 上可重定位调用后,来自 pypi 的那些很好,但是它从 github 安装的应用程序的站点包中的链接仍然指向旧目录位置。

其他人见过这种行为吗?有什么快速的方法吗?此外, relocatable 不尊重最初在 virtualenv 上使用的 --no-site-packages 标志。移动虚拟并重新激活它后,系统的站点包中的所有内容都可见。文档表明这种行为是事实,所以我想知道是否有任何快速的方法来解决这个问题?

4

2 回答 2

14

文档 --relocatable中所述,这是一个实验性选项,因此您遇到困难也就不足为奇了。--relocatable也就是说,您还记得安装新软件包后重新运行吗?如果您使用 github 从 github 安装包-e,这可能是个问题,因为它不会安装到站点包中,而是将符号链接安装到其中。作为 using 的替代方法--relocatable,您通常可以擦除特定于 virtualenv 的文件并重新创建它(在平台之间切换时我已经做过几次)。

于 2011-08-22T20:32:50.550 回答
12

不,对于一个 '--relocatable' 不会更新 'virtualenv/bin/activate' 脚本。是的,您可以按照 zeekay 的建议通过重新运行虚拟环境设置来解决这个问题,但是仍然无法导入放置在“virtualenv/src”中的任何“pip -e git ...”安装,因此您将不得不重新运行那些 pip 手动安装。

随着我作为开发人员获得了经验,我现在避免了额外的依赖和抽象层,它们往往会成为失败点。

所以现在我不使用 pip 可编辑(-e)安装,如果需要手动将存储库克隆到 'project/src/' 而不是 'project/virtualenv/src' 并auto_prep_pythonpath.py在启动我的项目之前加载以下脚本(我在我的django.wsgi脚本中引用它)。

作为旁注,我将“定制”附加到放置在“项目/src”中的任何被修改/被黑客攻击的包中,这样我就不必担心向后兼容性,并且我可以像在线存储库一样跟踪代码控制下的所有源代码并且会给你刹车。

希望这可以帮助。

"""
Prepares python path to include additional project/src/<APP> in PYTHONPATH - This file gets automatically loaded by projects __init__.py

This script lives in 'project/src/django-project/auto_prep_pythonpath.py', modify 
'SOURCE_ROOT' if you place it somewhere else.
"""
import logging
import os
import sys
SOURCE_ROOT = os.path.dirname(os.path.abspath(__file__)).replace('\\','/') # the replacements are when on windows
SOURCE_ROOT = os.path.join(SOURCE_ROOT, '../').replace('\\','/') 
SOURCE_ROOT = os.path.normpath(SOURCE_ROOT)

logger = logging.getLogger(__name__)

logger.info("Adding packages in 'src/*' required by project to PYTHONPATH.")
dirlist_arr = os.listdir(SOURCE_ROOT)
while dirlist_arr:
    item_path = os.path.join(SOURCE_ROOT, dirlist_arr.pop()).replace('\\','/') # replace dashes is for win based file system
    if os.path.isdir(item_path):
        if not item_path in sys.path:
            sys.path.insert(0, item_path) # we use insert to take precedence over any global paths - minimizes import conflict surprises
        logger.debug("Path '%s' added."  % item_path)
于 2013-04-04T16:55:14.553 回答