51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

setV:一个管理 Python 虚拟环境的 Bash 函数

了解一下 setV,它是一个轻量级的 Python 虚拟环境管理器,是 virtualenvwrapper 的替代产品。

这一年多来,我的 bash_scripts 项目中悄悄隐藏这 setV,但现在是时候该公开了。setV 是一个 Bash 函数,我可以用它代替 virtualenvwrapper。它提供了使你能够执行以下操作的基本功能:

  • 默认使用 Python 3
  • 创建一个新的虚拟环境
  • 使用带有 -p(或 --python)的自定义 Python 路径来创建新的虚拟环境
  • 删除现有的虚拟环境
  • 列出所有现有的虚拟环境
  • 使用制表符补全(以防你忘记虚拟环境名称)

安装 {#toc_1}

要安装 setV,请下载该脚本:

curl https://gitlab.com/psachin/setV/raw/master/install.sh

审核一下脚本,然后运行它:

sh ./install.sh

当安装 setV 时,安装脚本会要求你引入(source)一下 ~/.bashrc~/.bash_profile 的配置,根据你的喜好选择一个。

用法 {#toc_2}

基本的命令格式是 setv

创建虚拟环境 {#toc_3}

setv --new rango  # setv -n rango

或使用定制的 Python 路径

setv --new --python /opt/python/python3 rango # setv -n -p /opt/python/python3 rango


激活已有的虚拟环境 {#toc_4}

setv VIRTUAL_ENVIRONMENT_NAME

示例

setv rango

列出所有的虚拟环境 {#toc_5}

setv --list
# 或
setv [TAB] [TAB]

删除虚拟环境 {#toc_6}

setv --delete rango

切换到另外一个虚拟环境 {#toc_7}

# 假设你现在在 'rango',切换到 'tango'
setv tango

制表符补完 {#toc_8}

如果你不完全记得虚拟环境的名称,则 Bash 式的制表符补全也可以适用于虚拟环境名称。

参与其中 {#toc_9}

setV 在 GNU GPLv3下开源,欢迎贡献。要了解更多信息,请访问它的 GitLab 存储库中的 setV 的 README 的贡献部分。

setV 脚本 {#toc_10}

#!/usr/bin/env bash
# setV - A Lightweight Python virtual environment manager.
# Author: Sachin (psachin) <iclcoolster@gmail.com>
# Author's URL: https://psachin.gitlab.io/about
#
# License: GNU GPL v3, See LICENSE file
#
# Configure(Optional):
# Set `SETV_VIRTUAL_DIR_PATH` value to your virtual environments
# directory-path. By default it is set to '~/virtualenvs/'
#
# Usage:
# Manual install: Added below line to your .bashrc or any local rc script():
# ---
# source /path/to/virtual.sh
# ---
#
# Now you can 'activate' the virtual environment by typing
# $ setv <YOUR VIRTUAL ENVIRONMENT NAME>
#
# For example:
# $ setv rango
#
# or type:
# setv [TAB] [TAB]  (to list all virtual envs)
#
# To list all your virtual environments:
# $ setv --list
#
# To create new virtual environment:
# $ setv --new new_virtualenv_name
#
# To delete existing virtual environment:
# $ setv --delete existing_virtualenv_name
#
# To deactivate, type:
# $ deactivate

Path to virtual environment directory

SETV_VIRTUAL_DIR_PATH="$HOME/virtualenvs/"

Default python version to use. This decides whether to use virtualenv or python3 -m venv

SETV_PYTHON_VERSION=3 # Defaults to Python3 SETV_PY_PATH=$(which python${SETV_PYTHON_VERSION})

function setvcomplete() {

Bash-autocompletion.

This ensures Tab-auto-completions work for virtual environment names.

local cmd="${1##*/}" # to handle command(s).

Not necessary as such. 'setv' is the only command

local word=${COMP_WORDS[COMP_CWORD]} # Words thats being completed
local xpat='${word}'                 # Filter pattern. Include
                                     # only words in variable '$names'
local names=$(ls -l &quot;${SETV_VIRTUAL_DIR_PATH}&quot; | egrep '^d' | awk -F &quot; &quot; '{print $NF}') # Virtual environment names

COMPREPLY=($(compgen -W &quot;$names&quot; -X &quot;$xpat&quot; -- &quot;$word&quot;)) # compgen generates the results

}

function setv_help() {

Echo help/usage message

echo "Usage: setv [OPTIONS] [NAME]" echo Positional argument: echo -e "NAME Activate virtual env." echo Optional arguments: echo -e "-l, --list List all Virtual Envs." echo -e "-n, --new NAME Create a new Python Virtual Env." echo -e "-d, --delete NAME Delete existing Python Virtual Env." echo -e "-p, --python PATH Python binary path." }

function _setv_custom_python_path() { if [ -f "${1}" ]; then if [ "expr $1 : '.*python\([2,3]\)'" = "3" ]; then SETV_PYTHON_VERSION=3 else SETV_PYTHON_VERSION=2 fi SETV_PY_PATH=${1} _setv_create $2 else echo "Error: Path ${1} does not exist!" fi }

function _setv_create() {

Creates new virtual environment if ran with -n|--new flag

if [ -z ${1} ]; then echo "You need to pass virtual environment name" setv_help else echo "Creating new virtual environment with the name: $1"

    if [ ${SETV_PYTHON_VERSION} -eq 3 ];
    then
        ${SETV_PY_PATH} -m venv ${SETV_VIRTUAL_DIR_PATH}${1}
    else
        virtualenv -p ${SETV_PY_PATH} ${SETV_VIRTUAL_DIR_PATH}${1}
    fi
echo &amp;quot;You can now activate the Python virtual environment by typing: setv ${1}&amp;quot;

fi

}

function _setv_delete() {

Deletes virtual environment if ran with -d|--delete flag

TODO: Refactor

if [ -z ${1} ]; then echo "You need to pass virtual environment name" setv_help else if [ -d ${SETV_VIRTUAL_DIR_PATH}${1} ]; then read -p "Really delete this virtual environment(Y/N)? " yes_no case $yes_no in Y|y) rm -rvf ${SETV_VIRTUAL_DIR_PATH}${1};; N|n) echo "Leaving the virtual environment as it is.";; *) echo "You need to enter either Y/y or N/n" esac else echo "Error: No virtual environment found by the name: ${1}" fi fi }

function _setv_list() {

Lists all virtual environments if ran with -l|--list flag

echo -e "List of virtual environments you have under ${SETV_VIRTUAL_DIR_PATH}:\n" for virt in $(ls -l "${SETV_VIRTUAL_DIR_PATH}" | egrep '^d' | awk -F " " '{print $NF}') do echo ${virt} done }

function setv() {

Main function

if [ $# -eq 0 ]; then setv_help elif [ $# -le 3 ]; then case "${1}" in -n|--new) _setv_create ${2};; -d|--delete) _setv_delete ${2};; -l|--list) _setv_list;; *) if [ -d ${SETV_VIRTUAL_DIR_PATH}${1} ]; then

Activate the virtual environment

source ${SETV_VIRTUAL_DIR_PATH}${1}/bin/activate else

Else throw an error message

echo "Sorry, you don't have any virtual environment with the name: ${1}" setv_help fi ;; esac elif [ $# -le 5 ]; then case "${2}" in -p|--python) _setv_custom_python_path ${3} ${4};; *) setv_help;; esac fi }

Calls bash-complete. The compgen command accepts most of the same

options that complete does but it generates results rather than just

storing the rules for future use.

complete -Fsetvcompletesetv



via: https://opensource.com/article/20/1/setv-bash-function

作者:Sachin Patil 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

赞(1)
未经允许不得转载:工具盒子 » setV:一个管理 Python 虚拟环境的 Bash 函数