virtualenv可重定位——真的

2024-10-01 17:30:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

还有人见过这种行为吗?有什么捷径吗? 另外,relocatable并没有遵守最初在virtualenv上使用的--no site packages标志。一旦移动虚拟机并重新激活它,系统的站点包中的所有内容都将可见。文档表明这种行为是事实,所以我想知道是否有什么快速的方法可以解决这个问题?


Tags: pip项目答案定位github目录txtpypi
2条回答

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

不,对于一个'--relocatable'不更新'virtualenv/bin/activate'脚本。是的,您可以按照zeekay的建议重新运行virtual env安装程序来解决这个问题,但是stills无法导入任何放置在virtualenv/src中的“pip-e git…”安装,因此您必须手动重新运行这些pip安装程序。

作为一名开发人员,我已经积累了经验,现在我避免了附加的依赖层和抽象层,这些层往往是失败的点。

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

顺便说一下,我在“project/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)

相关问题 更多 >

    热门问题