pyenv是一個python版本管理工具,能夠實現輕鬆切換多個python版本html
它可根據每一個用戶更改全局python版本,也能夠爲每一個項目指定python版本,還能夠管理virtualenv虛擬環境,能夠本身建立virtualenv或者經過pyenv-virtualenv來自動化建立虛擬環境python
pyenv經過PATH環境變量來匹配切換python或者pip的工做目錄,pyenv經過讀取工做環境來指定使用哪一個python版本,如在當前會話中查找PYENV_VERSION環境變量,能夠經過pyenv shell 來設置shell會話變量,在當前目錄中的特定應用程序文件.python-version,可使用pyenv local來設置.python-version,它會搜索每一個父目錄直到根目錄;全局$(pyenv root)/version文件能夠經過pyenv global命令修改,經過讀取這些環境變量或文件來指定運行的python版本,也能夠多個版本並行,更多詳細內容請去github上pyenv項目linux
安裝前需檢查是否有如下安裝依賴包:git
yum install git -y yum -y install gcc make patch gdbm-devle openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel
建立python用戶:
useradd python
切換到pyhton 用戶後按下面的方式安裝:github
(1)使用下面的腳本自動安裝
1)經過腳本自動安裝web
$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
2)添加環境變量到.bashrcredis
export PATH="~/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
3)更新pyenv版本sql
$ pyenv update
#檢查安裝狀況shell
$ pyenv -v pyenv 1.2.4
(2)離線安裝
直接獲取文件,使用git連接clone到本地目錄數據庫
#useradd python #su - python $mkdir .pyenv $su - root #先切換回root給python用戶設置sudo權限 #echo "python ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers #tail -1 /etc/sudoers #su - python #切換回python用戶 $sudo git clone https://github.com/pyenv/pyenv.git ~/.pyenv #pyenv主程序 $sudo git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv #管理virtualenv插件 $sudo git clone https://github.com/pyenv/pyenv-which-ext.git ~/.pyenv/plugins/pyenv-which-ext #整個pyenv和系統命令插件 $sudo git clone https://github.com/pyenv/pyenv-update.git ~/.pyenv/plugins/pyenv-update #pyenv更新插件 $sudo git clone https://github.com/pyenv/pyenv-doctor.git ~/.pyenv/plugins/pyenv-doctor #檢查開發工具插件 #$sudo git clone https://github.com/pyenv/pyenv-ccache.git ~/.pyenv/plugins/pyenv-ccache #ccache插件,必須安裝ccache 配置環境變量: $vim .bash_profile export PYENV_ROOT=~/.pyenv export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
$source .bash_profile $pyenv -v pyenv 1.2.4-8-g43235c2
$pyenv -h Usage: pyenv <command> [<args>] 列出全部可用的pyenv命令: local 設置或顯示本地應用程序特定的Python版本 global 設置或顯示全局Python版本 shell 設置或顯示特定於shell的Python版本 install 使用Pyenv構建安裝Python版本 uninstall 卸載特定的Python版本 rehash 重置pyenv shims(安裝可執行文件後運行此操做) version 顯示當前Python版本及其來源 versions 列出PyEnv可用的全部Python版本 which 顯示可執行文件的完整路徑 whence 列出包含給定可執行文件的全部Python版本
#安裝python版本
$ pyenv help install 查看安裝幫助
$ pyenv install -l 顯示可安裝版本
$ pyenv install 3.5.4 安裝3.5.4版本python
#可使用緩存方法安裝
#在.pyenv目錄下,新建cache目錄,存放下載好的版本文件,能夠本身手動下載好後放進去,省了遠程下載時間,而後安裝便可。
安裝完成後更新數據庫:
$pyenv rehash
#使用pyenv的local,global,shell,分別指定本地,全局,當前會話的python版本
$ pyenv versions #查看已安裝的版本,*爲系統自帶的正在使用的python * system (set by /home/python/.pyenv/version) 3.5.4 $ pyenv local 3.5.4 #設置本地環境python版本 $ pyenv versions system * 3.5.4 (set by /home/python/.python-version) $ pyenv local 3.5.4 $ pyenv local system $ pyenv local system
#使用插件virtualenv建立虛擬環境
$ pyenv virtualenv 3.5.4 zhang_python354 #使用python3.5.4建立virtualenv $ pyenv versions * system (set by /home/python/.python-version) 3.5.4 3.5.4/envs/zhang_python354 zhang_python354 $ cd .pyenv/versions/ $ ls #真實目錄在.pyenv/versions下 3.5.4 zhang_python354 $ mkdir project_app 建立程序目錄 $ cd project_app $ pyenv local zhang_python354 #指定目錄下的python版本 (zhang_python354) [python@python project_app]$ pyenv local zhang_python354 (zhang_python354) [python@python project_app]$ cd [python@python ~]$ pyenv local system [python@python ~]$ cd project_app/ (zhang_python354) [python@python project_app]$
#pip通用配置
$ mkdir ~/.pip $ vim ~/.pip/pip.conf [global] index-url=https://mirrors.aliyun.com/pypi/simple/ trusted-host=mirrors.aliyun.com #查看pip使用的環境: (zhang_python354) [python@python zhang_python354]$ pip -V #安裝ipython (zhang_python354) [python@python zhang_python354]$ pip install ipython #在虛擬環境中安裝ipython,這個模塊只在虛擬環境中。
#安裝Jupyter,它是一個輕量級的web界面的python開發測試環境
$ pip install jupyter $ jupyter notebook help #查看幫助 #修改jupyter密碼 $ jupyter notebook password #啓動jupyter $ jupyter notebook --ip=0.0.0.0 --no-browser ...... http://0.0.0.0:8888/?token=ab2a1fad679c1de14dd6517b3aeb30fc6a440199031f47cd #經過瀏覽器訪問jupyter,開始編程之旅 http://ip:8888 #輸入密碼登錄
#導出當前虛擬環境的包
$ pip freeze >~/zhangpackages.txt
#能夠將此環境中用到的包導入到其餘環境,但python版本要相同
$pip install -r ~/zhangpackages.txt
pipenv是python官方推薦的python打包工具,它會自動爲您的項目建立和管理virtualenv,並在安裝或卸載軟件包時從您的pipfile中添加或刪除軟件包,它會爲你的項目建立一個很是重要的pipfile.lock文件,用於生成肯定性構建的python包版本號及包依賴關係。
它將Pipfile,pip和virtualenv整合到一個命令中。
pipenv的特性:
(1)它將pip和virtualenv合併在一塊兒使用
(2)以前管理的requirements.txt文件記錄的包信息不夠詳細在遷移導入是會出現問題,pipenv中使用pipfile和pipfile.lock來詳細記錄包信息
(3)能夠經過pipenv graph詳細的查看包的依賴關係
(4)經過加載.env文件能夠簡化開發工做流程
pipenv它會在你安裝了pyenv的狀況下自動安裝python版本,它會自動遞歸查找項目中的pipfile文件,若是不存在則建立,virtualenv是自動建立的,pipenv主要命令有install ,uninstal ,lock ,graph顯示已安裝的包的依賴關係,shell將激活virtualenv生成一個shell,run從virtualenv環境運行命令,check檢查安全漏洞
在安裝以前須要安裝配置好python和pip,參考python安裝
使用pip安裝pipenv:
$pip3 install pipenv #或者指定用戶安裝 $pip3 install --user pipenv
$ln -sv /usr/local/python356/bin/pipenv /usr/bin/pipenv
pipenv原始安裝:如在沒有安裝pip的狀況下,可使用這種方法安裝
$ curl https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python3
$ln -sv /usr/local/python356/bin/pipenv /usr/bin/pipenv
pipenv: Usage: pipenv [OPTIONS] COMMAND [ARGS]... 選項: --where 顯示項目路徑 --venv 輸出virtualenv信息 --py 輸出Python解釋器信息 --envs 輸出環境變量選項 --rm 移除virtualenv --bare 最小輸出 --completion 輸出完成 --man 顯示聯機幫助頁 --three / --two 建立python虛擬環境,python3用three,2用two --python TEXT 指定python版本建立virtualenv項目 --site-packages 啓用虛擬環境下的包 --version 顯示版本 -h, --help 顯示幫助信息 使用示例: 使用python 3.6建立一個新項目: $ pipenv --python 3.6 安裝項目並安裝dev依賴關係包: $ pipenv install --dev 建立一個包含預發佈的鎖文件: $ pipenv lock --pre 顯示鎖安裝包的依賴: $ pipenv graph 檢查已安裝的依賴關係是否存在安全漏洞: $ pipenv check 將本地setup.py安裝到您的虛擬環境中pipfile: $ pipenv install -e . 使用較低級別的pip命令: $ pipenv run pip freeze 生成一個鎖文件: $pipenv lock 安裝全部開發依賴包: $pipenv install --dev 卸載全部內容: $pipenv uninstall --all 激活虛擬環境: $pipenv shell 命令: check 檢查安裝的依賴關係是知足Pipfile中提供的安全漏洞和PEP 508標記要求 --three,--two 建立virtualenv時使用的python3/2 --python <python> 制定哪一個版本的virtualenv應該使用 --system 使用系統python --unused <unused> 給定代碼路徑,顯示可能未使用的依賴關係 clean 卸載未在Pipfile.lock中指定的全部軟件包 --v,--verbose 顯示詳細信息 --dry-run 只顯示不須要的包 graph 顯示當前安裝的依賴關係圖信息 --json 輸出JSON --json-tree 數結構輸出json --reverse 反向依賴關係圖 install 安裝軟件包 --d,--dev 在[dev-ackages]中安裝軟件包 --two- 使用系統python2連接在virtualenv中執行安裝。 --three- 使用系統python3連接在virtualenv中執行安裝。 --python - 使用提供的Python解釋器在virtualenv中執行安裝。 --pypi-mirror <pypi_mirror> 指定一個pypi鏡像來安裝 --system 使用系統pip命令而不是virtualenv中的命令。 -r,--requirements <requirements> 導入一個reqquirements.txt文件 -c,--code <code> 從代碼庫導入 -v,--verbose 詳細模式 --ignore-pipfile- 忽略Pipfile並從中安裝Pipfile.lock。 --skip-lock 忽略Pipfile.lock並從中安裝Pipfile並不寫入Pipfile.lock的變化 --deploy 若是pipfile.lock過期或python版本錯誤則終止 --pre 容許預發佈 --keep-outdated 防止pipfile.lock中過期的依賴項 --selective-upgrage 更新制定的包 lock 生成Pipfile.lock鎖 -r,--requirements 生成與requirements.txt兼容的包文件 -d,--dev 生成與requirements.txt兼容的開發依賴項 --clear 清除依賴關係緩存 --keep-outdated 防止pipfile.lock中更新過期的依賴項 open 在編輯器中查看給定的模塊 run 將從virtualenv運行給定的命令,並轉發任何參數 shell 激活virtualenv虛擬環境生成一個shell環境 sync 安裝在Pipfile.lock中指定的全部軟件包 uninstall 取消安裝提供的軟件包並將其從Pipfile中刪除 --all - 該參數將清除虛擬環境中的全部文件,但不改變Pip文件。 --all-dev - 該參數將從虛擬環境中刪除全部開發包,並將其從Pipfile中刪除。 update 運行鎖定,而後同步 --outdated 列出過時的依賴關係
#建立項目目錄 #mkdir project_01 #cd project_01 #生成virtualenv並安裝redis,將在項目目錄下建立Pipfile文件 #pipenv install redis Creating a virtualenv for this project… Using /usr/local/python365/bin/python3.6 (3.6.5) to create virtualenv… ⠋Already using interpreter /usr/local/python365/bin/python3.6 Using base prefix '/usr/local/python365' New python executable in /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/python3.6 Also creating executable in /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/python Installing setuptools, pip, wheel...done. Virtualenv location: /root/.local/share/virtualenvs/project_01-AJQOUQOt Creating a Pipfile for this project… Installing redis… Collecting redis Using cached https://files.pythonhosted.org/packages/3b/f6/7a/redis-2.10.6-py2.py3-none-any.whl Installing collected packages: redis Successfully installed redis-2.10.6 Adding redis to Pipfile's [packages]… Pipfile.lock not found, creating… Locking [dev-packages] dependencies… Locking [packages] dependencies… Updated Pipfile.lock (ab7b2e)! Installing dependencies from Pipfile.lock (ab7b2e)… To activate this project's virtualenv, run the following: $ pipenv shell #激活virtualenv #pipenv shell Spawning environment shell (/bin/bash). Use 'exit' to leave. [root@pypc@project_01@20:54@1]#. /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/activate #查看項目目錄 #pipenv --where /project_01 #查看python版本 #pipenv --py /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/python #查看virtualenv路徑 #pipenv --venv /root/.local/share/virtualenvs/project_01-AJQOUQOt #查看包依賴關係圖 #pipenv graph redis==2.10.6
#exit 退出virtualenv
#建立項目虛擬環境 $pipenv install #指定python版本建立虛擬環境 $pipenv --two $pipenv --three $pipenv --python 3.6.5 #升級全部包 $pipenv update #升級某一個包,如:redis $pipenv update redis #顯示項目路徑 $pipenv --where #顯示virtualenv路徑 $pipenv --venv #顯示python虛擬解釋器 $pipenv --py #激活虛擬環境 $pipenv shell #安裝requests模塊 $pipenv install requests #查看目前安裝的庫及依賴關係 $pipenv graph #檢查包的安全性 #pipenv check #激活虛擬環境並運行shell命令 $pipenv run which python #從文件導入包 $pipenv install -r path/to/requirements.txt #凍結軟件包和版本依賴關係,生成Pipfile.lock文件 $pipenv lock #安裝開發包 $pipenv install --dev pytest
#使用系統上的python自帶的包組件
$pipenv --three --site-packages
$cat Pipfile [[source]] url = "https://pypi.org/simple" #用來配置安裝包的源,能夠更換國內的源,注意在更好沒有https的源時會不信任站點將verify_ssl設置爲false verify_ssl = true name = "pypi"
[[source]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
uerify_ssl = true
name = 'tuna'
[packages]
requests = {version = "*", index = 'tuna''} #爲不一樣的包指定不一樣的安裝源
maya = {version = "*", index = "pypi"
[packages] #安裝的包及版本關係顯示 redis = "*" [dev-packages] #安裝的開發包 [requires] #指定項目運行的python版本,你能夠在此指定一個系統上沒有的版本,在建立虛擬環境是pipenv會經過pyenv下載指定版本的python python_version = "3.6"
Pipenv帶有一些能夠經過shell環境變量啓用的選項。要激活它們,只需在shell中建立變量,pipenv將檢測它
PIPENV_VENV_IN_PROJECT用來設置虛擬環境的位置,若是將值設爲1,而後在當前要建立虛擬目錄下建立(.vnev)文件,在激活虛擬環境後會在當前 目錄(.venv)目錄下,將虛擬環境的位置設置在當前目錄下的.venv目錄下
$export PIPENV_NENV_IN_PROJECT=1 $pipenv shell
pipenv會自動加載項目中的.env文件,若是.env文件不在項目路徑下能夠經過變量來設置PIPENV_DOTENV_LOCATION來指定.env的路徑
$PIPENV_DOTENV_LOCATION=/PATH/to/.env pipenv shell #若是要防止pipenv加載.env文件,請設置PIPENV_DONT_LOAD_ENV環境變量的值爲1 $PIPENV_DONT_LOAD_ENV=1 pipenv shell
若是要自定義虛擬環境位置,可使用變量WORKON_HOME來設置建立的虛擬環境.venv路徑,注意在使用了PIPENV_NENV_IN_PROJECT變量的狀況下WORKON_HOME不會生效
$export WORKON_HOME=/project/.venvs $pipenv --three #將在指定的目錄下生成虛擬環境
能夠經過PIPENV_CACHE_DIRL變量來指定pipenv的緩存位置
若是系統安裝了pyenv的話,在你的虛擬目錄文件Pipfile中配置了python版本,如3.8,但在建立虛擬環境時沒有在系統中找到此python版本,則pipenv將詢問並調用pyenv安裝須要的python版本,而後配置虛擬環境
例如我安裝了request軟件包,但它依賴別的不少包,具體請開下面詳細輸出,但在卸載requests包時,pipenv將忽略依賴關係包只卸載requests包,感受上像是一個bug
#pipenv install requests -v Installing requests… #pipenv graph requests==2.19.0 - certifi [required: >=2017.4.17, installed: 2018.4.16] - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4] - idna [required: <2.8,>=2.5, installed: 2.7] - urllib3 [required: >=1.21.1,<1.24, installed: 1.23] #看下Pipfile.lock文件記錄很詳細 #cat Pipfile.lock { "_meta": { "hash": { "sha256": "44a80a6b0595dff14e33470723a9eaddd419f3cb2188cfa8a9f6c6db1afa7db5" }, "pipfile-spec": 6, "requires": { "python_version": "3.6" }, "sources": [ { "name": "pypi", "url": "http://mirrors.aliyun.com/pypi/simple", "verify_ssl": false } ] }, "default": { "certifi": { "hashes": [ "sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7", "sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0" ], "version": "==2018.4.16" }, "chardet": { "hashes": [ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" ], "version": "==3.0.4" }, "idna": { "hashes": [ "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" ], "version": "==2.7" }, "requests": { "hashes": [ "sha256:421cfc8d9dde7d6aff68196420afd86b88c65d77d8da9cf83f4ecad785d7b9d6", "sha256:cc408268d0e21589bcc2b2c248e42932b8c4d112f499c12c92e99e2178a6134c" ], "index": "pypi", "version": "==2.19.0" }, "urllib3": { "hashes": [ "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" ], "version": "==1.23" } }, "develop": {} } #卸載requests #pipenv uninstall requests -v Un-installing requests… $ "/root/.venvs/p5-FPX5z4vr/bin/pip" uninstall requests -y Uninstalling requests-2.19.0: Successfully uninstalled requests-2.19.0 Removing requests from Pipfile… Locking [dev-packages] dependencies… Locking [packages] dependencies… Updated Pipfile.lock (5020d6)! #依賴包沒有卸載 #pipenv graph certifi==2018.4.16 chardet==3.0.4 idna==2.7 urllib3==1.23 #但Pipfile.lock文件中全部依賴包記錄都沒有了 #cat Pipfile.lock { "_meta": { "hash": { "sha256": "19ca19fa2378f4a82aad03ab25d4575bcdfa444de3d0e7d0f9faab8b5c5020d6" }, "pipfile-spec": 6, "requires": { "python_version": "3.6" }, "sources": [ { "name": "pypi", "url": "http://mirrors.aliyun.com/pypi/simple", "verify_ssl": false } ] }, "default": {}, "develop": {} } #也就是說pipenv不能卸載包的依賴包,若是卸載了requests包從新安裝的話,pipenv將從新再安裝一遍依賴包
本身寫個腳本實現:
#cat depends.py #!/usr/bin/env python3 #coding:utf-8 import sys import json def depends(packages,package): depend=set() depend2=set() for item in packages: if item['package']['key'] == package: for k in item['dependencies']: depend.add(k['key']) for i in packages: if i['dependencies']: for j in i['dependencies']: if i['package']['key'] in depend: depend2.add(j['key']) data = depend.union(depend2) data.add(package) return ' '.join(data) if __name__ == '__main__': package = sys.argv[1] packages = json.load(sys.stdin) data = depends(packages,package) print(data)
#pipenv uninstall `pipenv graph --json|python3 depends.py ipython` #執行腳本說明 #1.執行pipenv uninstall卸載包 #2.調用pipenv graph --json獲取包依賴關係的 json格式化後的列表 #3.將列表寫入管道後處理 #4.使用python執行腳本獲取兩個參數sys.argv[1]獲取參數也就是要卸載的包名,第二個參數是獲取的json格式化的列表字符串 #5.經過執行腳本獲取包的依賴的包名,而後執行卸載包和與之關聯的全部依賴包 #注意:要卸載其它包請將腳本後的參數改成要卸載的包名也就是上面列子中的ipython #腳本通過測試暫未發現問題,值得說明的是如須要卸載關聯嵌套3層的包將沒法卸載,也就是要卸載的包下依賴包下的依賴包下的依賴包
#安裝autoenv pip3 install autoenv #或者以源碼安裝 git clone https://github.com/kennethreitz/autoenv.git ~/.autoenv #而後配置autoenv的PATH #官方推薦方法: echo 'source ~/.autoenv/activate.sh' >>~/.bashrc #其實是將source加activate.sh寫入到環境變量中供bash讀取,activate.sh是安裝的autoenv的執行文件,
#只要找到activate.sh文件路徑經過source或(.)寫入到系統環境變量中便可,如:source /etc/bin/activate.sh
#加入到~/.bash或者/etc/proflie中 #若是是pip安裝的autoenv,則activate.sh文件在python版本的bin目錄下,能夠作連接到PATH可讀取的路徑中,
#也能夠在也能夠直接使用絕對路徑來配置,如: $tail -1 ~/.bashrc source /usr/local/python365/bin/activate.sh $source ~/.bashrc #最後在pipenv建立的項目目錄下新建.env文件,寫入pipenv shell,便可在切換到項目目錄下自動進入virtualenv虛擬
#環境中的shell,第一次執行會有提示選擇y贊成,之後就不提示了,設置以下: #cd project_01 #進入項目目錄#ls #vi .env #cat .env pipenv shell #cd .. #cd project_01/ -bash: shasum: command not found autoenv: autoenv: WARNING: autoenv: This is the first time you are about to source /project_01/.env: autoenv: autoenv: --- (begin contents) --------------------------------------- autoenv: pipenv shell autoenv: autoenv: --- (end contents) ----------------------------------------- autoenv: autoenv: Are you sure you want to allow this? (y/N) y Loading .env environment variables… Spawning environment shell (/bin/bash). Use 'exit' to leave. [root@pypc@project_01@00:28@1]#. /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/activate (project_01-AJQOUQOt) [root@pypc@project_01@00:28@2]#
---------------------------------------------------------------------------------end