---
# System prepended metadata

title: Python 內建 virtualenv 指令
tags: [NVIDIA, python, GPU, ubuntu, tutorials, linux, deep learning, AI, cuda]

---

###### tags: `tutorials` `python` `cuda` `GPU` `deep learning` `AI` `ubuntu` `linux` `NVIDIA`
# Python 內建 virtualenv 指令

## 1. 建立新環境
```
$ virtualenv {venv_name}
```
> {venv_name} 為新環境名稱

## 2.  設定CUDA版本
編輯 activate 內容
```
$ vim {venv_name}/bin/activate
```
> vim 是編輯文件指令，輸入 i 可以編輯，編輯完畢按下 esc 結束編輯，:wq 儲存並離開，:q 離開，:q!離開不儲存

增加 `add` 的區塊進原本 `{venv_name}/bin/activate` 檔案
~~~script
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly


if [ "${BASH_SOURCE-}" = "$0" ]; then
    echo "You must source this script: \$ source $0" >&2
    exit 33
fi

deactivate () {
    unset -f pydoc >/dev/null 2>&1

    # reset old environment variables
    # ! [ -z ${VAR+_} ] returns true if VAR is declared at all
    if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then
        PATH="$_OLD_VIRTUAL_PATH"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then
        PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # This should detect bash and zsh, which have a hash command that must
    # be called to get it to forget past commands.  Without forgetting
    # past commands the $PATH changes we made may not be respected
    if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
        hash -r 2>/dev/null
    fi

    if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then
        PS1="$_OLD_VIRTUAL_PS1"
        export PS1
        unset _OLD_VIRTUAL_PS1
    fi

    unset VIRTUAL_ENV
    if [ ! "${1-}" = "nondestructive" ] ; then
    # Self destruct!
        unset -f deactivate
    fi

    #####################################################
    ######################## add ########################
    #####################################################
    if ! [ -z "${_OLD_LD_LIBRARY_PATH+_}" ] ; then
        LD_LIBRARY_PATH="$_OLD_LD_LIBRARY_PATH"
        export LD_LIBRARY_PATH
        unset _OLD_LD_LIBRARY_PATH
    fi

    if ! [ -z "${_OLD_CUDA_HOME+_}" ] ; then
        CUDA_HOME="$_OLD_CUDA_HOME"
        export CUDA_HOME
        unset _OLD_CUDA_HOME
    fi
    #####################################################
    ######################## end ########################
    #####################################################
    
}

# unset irrelevant variables
deactivate nondestructive

VIRTUAL_ENV="{virtual_env_path}"
export VIRTUAL_ENV

########################################################
######################### add ##########################
########################################################
# set CUDA_HOME
cuda_path={cuda_path}
cuda_version={cuda_version_dir}
_OLD_CUDA_HOME="$CUDA_HOME"
export CUDA_HOME=$cuda_path/$cuda_version

# set library
_OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
########################################################
######################### end ##########################
########################################################

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
########################################################
#################### optional add ######################
########################################################
# (optional) nvcc -V will show current cuda version
export PATH=$CUDA_HOME/bin:$PATH
########################################################
######################### end ##########################
########################################################

# unset PYTHONHOME if set
if ! [ -z "${PYTHONHOME+_}" ] ; then
    _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
    unset PYTHONHOME
fi

if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
    _OLD_VIRTUAL_PS1="${PS1-}"
    if [ "x" != x ] ; then
        PS1="${PS1-}"
    else
        PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}"
    fi
    export PS1
fi

# Make sure to unalias pydoc if it's already there
alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true

pydoc () {
    python -m pydoc "$@"
}

# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands.  Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi
~~~

> {cuda_version} 為要選擇的 cuda 版本 ( 路徑必須存在，ex: cuda-10.0_cudnn7.4, cuda-10.0_cudnn7.6, cuda-9.0_cudnn7.6.1 )


## 3. 進入虛擬環境
```
$ source {venv_name}/bin/activate
```

## 4. 離開虛擬環境
```
$ deactivate
```