社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

setV:一个管理 Python 虚拟环境的 Bash 函数 | Linux 中国

Linux中国 • 6 年前 • 730 次点击  
了解一下 setV,它是一个轻量级的 Python 虚拟环境管理器,是 virtualenvwrapper 的替代产品。
-- Sachin Patil

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

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

安装

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

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

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

  1. sh ./install.sh

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

用法

基本的命令格式是 setv

创建虚拟环境

  1. setv --new rango  # setv -n rango
  2. # 或使用定制的 Python 路径
  3. setv --new --python /opt/python/python3 rango  # setv -n -p /opt/python/python3 rango

激活已有的虚拟环境

  1. setv VIRTUAL_ENVIRONMENT_NAME
  1. # 示例
  2. setv rango

列出所有的虚拟环境

  1. setv --list
  2. #
  3. setv [ TAB] [TAB]

删除虚拟环境

  1. setv --delete rango

切换到另外一个虚拟环境

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

制表符补完

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

参与其中

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

setV 脚本

  1. #!/usr/bin/env bash
  2. # setV - A Lightweight Python virtual environment manager.
  3. # Author: Sachin (psachin) <iclcoolster@gmail.com>
  4. # Author's URL: https://psachin.gitlab.io/about
  5. #
  6. # License: GNU GPL v3, See LICENSE file
  7. #
  8. # Configure(Optional):
  9. # Set `SETV_VIRTUAL_DIR_PATH` value to your virtual environments
  10. # directory-path. By default it is set to '~/virtualenvs/'
  11. #
  12. # Usage:
  13. # Manual install: Added below line to your .bashrc or any local rc script():
  14. # ---
  15. # source /path/to/virtual.sh
  16. # ---
  17. #
  18. # Now you can 'activate' the virtual environment by typing
  19. # $ setv
  20. #
  21. # For example:
  22. # $ setv rango
  23. #
  24. # or type:
  25. # setv [TAB] [TAB] (to list all virtual envs)
  26. #
  27. # To list all your virtual environments:
  28. # $ setv --list
  29. #
  30. # To create new virtual environment:
  31. # $ setv --new new_virtualenv_name
  32. #
  33. # To delete existing virtual environment:
  34. # $ setv --delete existing_virtualenv_name
  35. #
  36. # To deactivate, type:
  37. # $ deactivate
  38. # Path to virtual environment directory
  39. SETV_VIRTUAL_DIR_PATH="$HOME/virtualenvs/"
  40. # Default python version to use. This decides whether to use `virtualenv` or `python3 -m venv`
  41. SETV_PYTHON_VERSION=3 # Defaults to Python3
  42. SETV_PY_PATH=$(which python${SETV_PYTHON_VERSION})
  43. function _setvcomplete_()
  44. {
  45. # Bash-autocompletion.
  46. # This ensures Tab-auto-completions work for virtual environment names.
  47. local cmd="${1##*/}" # to handle command(s).
  48. # Not necessary as such. 'setv' is the only command
  49. local word=${COMP_WORDS[COMP_CWORD]} # Words thats being completed
  50. local xpat='${word}' # Filter pattern. Include
  51. # only words in variable '$names'
  52. local names=$(ls -l "${SETV_VIRTUAL_DIR_PATH}" | egrep '^d' | awk -F " " '{print $NF}') # Virtual environment names
  53. COMPREPLY=($(compgen -W "$names" -X "$xpat" -- "$word")) # compgen generates the results
  54. }
  55. function _setv_help_() {
  56. # Echo help/usage message
  57. echo "Usage: setv [OPTIONS] [NAME]"
  58. echo Positional argument:
  59. echo -e "NAME Activate virtual env."
  60. echo Optional arguments:
  61. echo -e "-l, --list List all Virtual Envs."
  62. echo -e "-n, --new NAME Create a new Python Virtual Env."
  63. echo -e "-d, --delete NAME Delete existing Python Virtual Env."
  64. echo -e "-p, --python PATH Python binary path."
  65. }
  66. function _setv_custom_python_path()
  67. {
  68. if [ -f "${1}" ];
  69. then
  70. if [ "`expr $1 : '.*python\([2,3]\)'`" = "3" ];
  71. then
  72. SETV_PYTHON_VERSION=3
  73. else
  74. SETV_PYTHON_VERSION=2
  75. fi
  76. SETV_PY_PATH=${1}
  77. _setv_create $2
  78. else
  79. echo "Error: Path ${1} does not exist!"
  80. fi
  81. }
  82. function _setv_create()
  83. {
  84. # Creates new virtual environment if ran with -n|--new flag
  85. if [ -z ${1} ];
  86. then
  87. echo "You need to pass virtual environment name"
  88. _setv_help_
  89. else
  90. echo "Creating new virtual environment with the name: $1"
  91. if [ ${SETV_PYTHON_VERSION} -eq 3 ];
  92. then
  93. ${SETV_PY_PATH} -m venv ${SETV_VIRTUAL_DIR_PATH}${1}
  94. else
  95. virtualenv -p ${SETV_PY_PATH} ${SETV_VIRTUAL_DIR_PATH}${1}
  96. fi
  97. echo "You can now activate the Python virtual environment by typing: setv ${1}"
  98. fi
  99. }
  100. function _setv_delete()
  101. {
  102. # Deletes virtual environment if ran with -d|--delete flag
  103. # TODO: Refactor
  104. if [ -z ${1} ];
  105. then
  106. echo "You need to pass virtual environment name"
  107. _setv_help_
  108. else
  109. if [ -d ${SETV_VIRTUAL_DIR_PATH}${1} ];
  110. then
  111. read -p "Really delete this virtual environment(Y/N)? " yes_no
  112. case $yes_no in
  113. Y|y) rm -rvf ${SETV_VIRTUAL_DIR_PATH}${1};;
  114. N|n) echo "Leaving the virtual environment as it is.";;
  115. *) echo "You need to enter either Y/y or N/n"
  116. esac
  117. else
  118. echo "Error: No virtual environment found by the name: ${1}"
  119. fi
  120. fi
  121. }
  122. function _setv_list()
  123. {
  124. # Lists all virtual environments if ran with -l|--list flag
  125. echo -e "List of virtual environments you have under ${SETV_VIRTUAL_DIR_PATH}:\n"
  126. for virt in $(ls -l "${SETV_VIRTUAL_DIR_PATH}" | egrep '^d' | awk -F " " '{print $NF}')
  127. do
  128. echo ${virt}
  129. done
  130. }
  131. function setv() {
  132. # Main function
  133. if [ $# -eq 0 ];
  134. then
  135. _setv_help_
  136. elif [ $# -le 3 ];
  137. then
  138. case "${1}" in
  139. -n|--new) _setv_create ${2};;
  140. -d|--delete) _setv_delete ${2};;
  141. -l|--list) _setv_list;;
  142. *) if [ -d ${SETV_VIRTUAL_DIR_PATH}${1} ];
  143. then
  144. # Activate the virtual environment
  145. source ${SETV_VIRTUAL_DIR_PATH}${1}/bin/activate
  146. else
  147. # Else throw an error message
  148. echo "Sorry, you don't have any virtual environment with the name: ${1}"
  149. _setv_help_
  150. fi
  151. ;;
  152. esac
  153. elif [ $# -le 5 ];
  154. then
  155. case "${2}" in
  156. -p|--python) _setv_custom_python_path ${3} ${4};;
  157. *) _setv_help_;;
  158. esac
  159. fi
  160. }
  161. # Calls bash-complete. The compgen command accepts most of the same
  162. # options that complete does but it generates results rather than just
  163. # storing the rules for future use.
  164. complete -F _setvcomplete_ setv

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

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

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

🐧:看到这里点一下在看呗?👇


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53246