我刚开始使用 pyenv 管理我的 Python 版本,并开始使用 pyenv virtualenv 插件管理我的虚拟环境,到目前为止,我非常喜欢它。不过,我遗憾的是,在使用 virtualenv 的时候,你可以将虚拟环境放置在代码库目录中,以使得代码库成为一个完全可重现的环境。 有没有人知道如何在 pyenv 中选择虚拟环境所在的目录?
我刚开始使用 pyenv 管理我的 Python 版本,并开始使用 pyenv virtualenv 插件管理我的虚拟环境,到目前为止,我非常喜欢它。不过,我遗憾的是,在使用 virtualenv 的时候,你可以将虚拟环境放置在代码库目录中,以使得代码库成为一个完全可重现的环境。 有没有人知道如何在 pyenv 中选择虚拟环境所在的目录?
简短回答: 据我所知,你不能这样做。
而且实际上也不会起作用,对吧?如果你使用 pyenv virtualenv
命令在一个repo中安装virtualenv,并将该repo克隆到另一台机器上... 新机器上的 pyenv
如何知道要控制存储在存储库中的virtualenv呢?
此外,“你可能不应该这样做”。Virtualenv并不是与底层Python安装完全隔离的,而且并不是非常便携。而且你真的想在你的repo中散布大量易于复制的垃圾代码吗?正确的方法可能是维护一个requirements.txt
文件,以供pip使用--这样你就可以在任何克隆你的repo的地方轻松地复现你的开发环境。
话虽如此,你完全可以使用普通的virtualenv
在任何地方创建virtualenv,即使你已经在pyenv
控制下的Python解释器中安装了virtualenv
。该virtualenv本身当然不会由pyenv
管理,但你仍然可以像以前一样使用它...
这里有一个项目追踪器上的GitHub问题:https://github.com/pyenv/pyenv/issues/802
一个项目合作者的回复如下:
你只需在任何位置创建虚拟环境。要从pyenv使用它,请在~/.pyenv/versions中创建到该环境的符号链接。
尽管我必须说我对这个解决方案不是很满意。not very satisfied with this solution
有一个解决方法
在您的项目目录中,创建一个.python-version
文件。假设您已经使用pyenv-virtualenv
安装了一些虚拟环境,然后将以下行追加到该文件中(您可能需要更改版本号):
3.7.1/envs/your-project-name@3.7.1
pyenv local <虚拟环境名称>
命令,pyenv将在当前路径下为您创建该文件。 - Terrabitspyenv local 3.9.16
然后
python -m venv virtualenv
它运行正常
pyenv install -s 3.8.3 # install preferred version if needed
PYENV_VERSION=3.8.3 python -m venv /tmp/your/prefered/dir ; source /tmp/your/prefered/dir/activate
我使用以下简单的步骤:
python -m venv virt
创建本地虚拟环境ln -s <local virt> ~/.pyenv/versions/<venv name>
将虚拟环境链接到 pyenvpyenv local <venv name>
命令,并且所有其他 pyenv 的操作都将在此虚拟环境中进行。对于有兴趣的人,我已经制作了两个CLI
pyenv-here
一次性创建新的虚拟环境并设置本地目录pyenv-link
将本地虚拟环境链接到pyenv顶部的评论是错误的;你当然可以。
一旦你使用pyenv virtualenv 3.9.15 your-environment-name
创建了你的虚拟环境,你可以使用以下命令自动指定该环境将自动使用的目录。在你想要的目录中运行:
pyenv local your-environment-name
.python-version
文件,其中包括您环境的名称。从现在开始,每次进入该文件夹时,指定的环境将被使用。venv
目录将被放置在哪里,而不是在您进入时会激活什么。 - Natachaenpy
,将其放在我的路径上,然后调用例如enpy -c import sys; print(sys.executable)
。#!/usr/bin/python3
import os
import sys
from pathlib import Path
NAMES = ("venv", "env", ".env", ".venv")
def find_python():
cwd = Path(os.getcwd())
for direc in [cwd] + list(cwd.parents):
for p in NAMES:
venv = direc / p
if venv.exists():
return venv / "bin" / "python"
else:
raise Exception("Could not find python")
python = find_python()
os.execvp(str(python), [str(python)] + sys.argv[1:])
在之前的评论基础上,你可以将以下内容添加到你的 .zshrc 文件中:
pyC () {
location="requirements.txt"
venvName=".venv"
# Parse flags
while getopts "r:e:" opt; do
case $opt in
e) venvName=$OPTARG ;;
r) location=$OPTARG ;;
\?) echo "Invalid option: -$OPTARG" ;;
:) echo "Option -$OPTARG requires an argument.";;
esac
done
# Remove existing virtual environment if it exists
[ -d $venvName ] && rm -rf $venvName
# Determine Python version (global or local)
pyVersion=$( [ -f .python-version ] && echo "local" || echo "global" )
# Check pyVersion, create version file, virtual environment, activate it
pyenv version-name $pyVersion | xargs -I {} pyenv local {} && python -m venv $venvName
source $venvName/bin/activate && pip install --upgrade pip
# Install requirements if file exists, otherwise print message
[ -f $location ] && pip install -r $location || echo -e "\nFile $location not found"
}
requirements.txt
文件和一个生成虚拟环境的脚本。我想要一个命令,在当前路径中查找虚拟环境,并且不想管理“全局”虚拟环境。我希望我的虚拟环境存在于一个目录中。 - Att Righ