在pyenv virtualenv上激活虚拟环境时如何导出PYTHONPATH?

在pyenv virtualenv上激活虚拟环境时如何导出PYTHONPATH?,python,virtualenv,pyenv,Python,Virtualenv,Pyenv,我正在使用和它的插件 我的问题是:当我在pyenv virtualenv上激活一些虚拟环境时,如何修改PYTHONPATH环境变量 $ pyenv activate myenv $ echo $PYTHONPATH # I want this variable! 当我使用简单的virtualenv时,我可以通过编辑virtualenv\u home/your\u env/bin/activate export OLD_PYTHONPATH=$PYTHONPATH export PYTHONP

我正在使用和它的插件

我的问题是:当我在pyenv virtualenv上激活一些虚拟环境时,如何修改PYTHONPATH环境变量

$ pyenv activate myenv
$ echo $PYTHONPATH  # I want this variable!
当我使用简单的virtualenv时,我可以通过编辑
virtualenv\u home/your\u env/bin/activate

export OLD_PYTHONPATH=$PYTHONPATH
export PYTHONPATH="/path/to/you/want"

我应该为pyenv virtualenv编辑哪个文件?

您只需按照常规设置
PYTHONPATH
,无论是在shell启动脚本中还是其他地方。当您使用
pyenv virtualenv
切换到pyenv控制的virtualenv时,它将自动将此virtualenv的所有必要目录附加到
sys.path
,但在
PYTHONPATH
变量中定义的任何目录都将位于它们之前

$ pyenv activate myenv
$ echo $PYTHONPATH  # I want this variable!
根据以下评论中的讨论添加:

您可以在
$pyenv_HOME/pyenv.d/
中为给定的pyenv命令创建钩子脚本。您甚至可以对pyenv的“陶瓷”命令执行此操作,这些命令通常不会被用户直接调用

应该可以为
activate
(切换到virtualenv时由pyenv virtualenv隐式调用)创建一个钩子,该钩子解析virtualenv的名称并基于该名称设置
$PYTHONPATH


注意:我以前写过pyenv钩子,但没有明确测试过这个解决方案。

是的,它在几乎所有情况下都能完美工作,但在一些罕见的情况下,它对我不起作用。假设我在virtualenv
env1
env2
中有名为
mod
的模块。在
env1
上,我想在
env1
中使用
mod
,在
env2
上,我想在
env2
中使用
mod
。这不可能吗?你能找出它不起作用的情况有什么不同吗?也许我们可以把这件事分开,弄清楚到底发生了什么……回应你编辑的评论:是的,你可以在多个VirtualNV中安装相同的模块。你不需要做任何特别的事情;您不需要编辑$PYTHONPATH。如果
mod
安装在
site packages
中,我不需要
PYTHONPATH
。据我所知,
PYTHONPATH
用于未安装的python脚本。
$PYTHONPATH
用于指定解释器为模块搜索的目录列表(除了标准位置)。所以,是的。您是说您希望在
env1
env2
的两个单独的外部位置提供两个版本的模块
mod
?换句话说,您想根据活动的virtualenv更改
$PYTHONPATH
的值吗?