【Tools】python环境操作笔记
python環(huán)境操作筆記
1.安裝Python虛擬環(huán)境
2.python pip 添加清華鏡像
3.Ubuntu卸載python后出現(xiàn)系統(tǒng)崩潰以及各種問題的解決方法
4.Python下關(guān)于 tkinter 錯(cuò)誤的解決方法
5. 字符串前面加u、r、b的含義
6. 中文的unicode編碼轉(zhuǎn)換為中文
7.運(yùn)行python文件,給命令行加參數(shù),指定某幾塊GPU
8.python中argparse模塊介紹
9. import numpy 和 from numpy import * 的區(qū)別
10.python進(jìn)程被kill掉后GPU顯存不釋放的問題
11.Python中復(fù)制與移動(dòng)的代碼
1.安裝Python虛擬環(huán)境
可參考 https://www.cnblogs.com/technologylife/p/6635631.html
Python虛擬環(huán)境的主要目的是為了給不同的工程創(chuàng)建互相獨(dú)立的運(yùn)行環(huán)境。在虛擬環(huán)境下,每一個(gè)工程都有自己的依賴包,而與其它的工程無關(guān)。不同的虛擬環(huán)境中同一個(gè)包可以有不同的版本。并且,虛擬環(huán)境的數(shù)量沒有限制,我們可以輕松地用virtualenv或者pyenv等工具來創(chuàng)建多個(gè)虛擬環(huán)境。
方法1:使用virtualenv (不推薦,進(jìn)入虛擬環(huán)境的命令也比較長(zhǎng),麻煩。可直接使用方法2)
1.安裝虛擬環(huán)境工具的方法
pip install virtualenv2.創(chuàng)建一個(gè)名字叫“zhz”的虛擬環(huán)境:
選擇使用一個(gè)Python解釋器:
virtualenv -p /usr/bin/python3.5 zhz # -p參數(shù)指定Python解釋器程序路徑,這將會(huì)使用 /usr/bin/python3.5 中的Python解釋器。下面這種簡(jiǎn)單方法不推薦
virtualenv zhz這條命令會(huì)自動(dòng)創(chuàng)建一個(gè)叫“zhz”的目錄.
3.進(jìn)入虛擬環(huán)境
在“zhz”目錄下的bin目錄下有一個(gè)重要的腳本文件activate,這個(gè)腳本就是用來將其所在的虛擬環(huán)境設(shè)置為當(dāng)前Python的運(yùn)行環(huán)境:
source zhz/bin/activate在運(yùn)行完這行命令后,shell的提示符前會(huì)出現(xiàn)虛擬環(huán)境"zhz"的名字,表示我們已經(jīng)進(jìn)入了這個(gè)環(huán)境中。
這里要注意區(qū)分Anaconda里面的命令,anaconda里面進(jìn)入tensorflow或者pytorch虛擬環(huán)境的命令是 source activate zhz
4.安裝各種Python包
使用 “pip install” 命令安裝,例如安裝numpy包
pip install numpy5.退出虛擬環(huán)境
直接使用deactivate命令即可退出虛擬環(huán)境
deactivate這里要注意區(qū)分Anaconda里面的命令,anaconda里面退出tensorflow或者pytorch虛擬環(huán)境的命令是 source deactivate
6.刪除虛擬環(huán)境
要?jiǎng)h除一個(gè)虛擬環(huán)境,只需刪除它的文件夾。執(zhí)行
rm -rf venv方法2:使用virtualenvwrapper管理虛擬環(huán)境 (推薦)
在Ubuntu下使用workon時(shí)出現(xiàn)workon: command not found錯(cuò)誤。解決方案如下:
鑒于virtualenv不便于對(duì)虛擬環(huán)境集中管理,所以推薦直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虛擬環(huán)境工作變得便利。它把你所有的虛擬環(huán)境都放在一個(gè)地方。
虛擬環(huán)境的引入解決了我們關(guān)于環(huán)境沖突的問題,但是它同時(shí)也帶來了一個(gè)問題,就是虛擬環(huán)境過多所帶來的管理問題。virtualenvwrapper就是專門用來解決虛擬環(huán)境管理問題的一個(gè)工具。我們可以很方便地用它來實(shí)現(xiàn)對(duì)虛擬環(huán)境的創(chuàng)建,刪除,拷貝,并且可以輕松地在不同環(huán)境間進(jìn)行切換。
1.安裝virtualenvwrapper:
pip install virtualenvwrapper使用
which virtualenvwrapper.sh查找到上一步得到的virtualenvwrapper.sh文件的位置,然后把該路徑(設(shè)為path)填到下面一步的第二句話。
2.配置 ~/.bashrc
將 virtualenv 添加進(jìn)去:將下面兩句話復(fù)制到 ~/.bashrc中,保存退出。
下面第二句句需要修改路徑為上一步的virtualenvwrapper.sh所在路徑path/virtualenvwrapper.sh
3.讓 bashrc 生效
執(zhí)行以下命令
source ~/.bashrc注意:
安裝virtualenvwrapper后(即執(zhí)行完第6步后)就可以使用 workon 命令了。
但是我們會(huì)發(fā)現(xiàn)使用workon zhz并不能進(jìn)入我們?cè)诘?步使用virtualenv zhz創(chuàng)建的環(huán)境zhz中去,并且提示我們使用mkvirtualenv zhz命令創(chuàng)建。
4.創(chuàng)建虛擬環(huán)境
指定python版本,可通過"–python"指定python解釋器(使用 whereis python命令或者which python可以查看系統(tǒng)中的Python解釋器路徑)
whereis python mkvirtualenv --python=/usr/local/python3.5.3/bin/python zhz # 這句話需要更改路徑這樣會(huì)在WORKON_HOME變量指定的目錄下新建名為zhz的虛擬環(huán)境,在.virtualenvs/目錄下。
查看該環(huán)境下都安裝了哪些軟件
會(huì)發(fā)現(xiàn)他們都在只有這幾個(gè)包才對(duì)
Package Version ------------- ------- pip 19.1.1 pkg-resources 0.0.0 setuptools 41.0.1 wheel 0.33.4如果接著要安裝pytorch,需要先安裝numpy之后才會(huì)import torch成功,因?yàn)閠orch依賴numpy
注意:
mkvirtualenv zhz這種不指定python解釋器的方法不推薦,因?yàn)闆]有指定python解釋器,默認(rèn)是系統(tǒng)默認(rèn)的python環(huán)境,因此該虛擬環(huán)境下有所有python 包,都是之前系統(tǒng)中pip安裝的。
使用mkvirtualenv創(chuàng)建虛擬環(huán)境之后后,會(huì)發(fā)現(xiàn)zhz環(huán)境創(chuàng)建在/home/zhz/.virtualenvs/目錄下,即創(chuàng)建在.virtualenvs/目錄下。而方法一是把環(huán)境’zhz’創(chuàng)建在/home/zhz/目錄下。
5.退出虛擬環(huán)境,直接使用deactivate命令即可退出虛擬環(huán)境
deactivate6.刪除虛擬環(huán)境
rmvirtualenv zhz2.python pip 添加清華鏡像
搜到兩篇博客寫的:
(1)使用pip 安裝python 庫時(shí)連接國外庫時(shí),下載需要很長(zhǎng)時(shí)間,在配置文件中設(shè)置國內(nèi)鏡像可以提高速度。
在linux 下創(chuàng)建 ~/.pip/pip.conf 文件。文件內(nèi)容如下
原文:https://blog.csdn.net/carbon06/article/details/80392248
(2)網(wǎng)上搜到的pip國內(nèi)鏡像大部分是豆瓣的:
http://pypi.douban.com/simple/
但是根本不全,很多包沒有,所以推薦清華大學(xué)的:
https://pypi.tuna.tsinghua.edu.cn/simple
臨時(shí)使用
可以在使用pip的時(shí)候加參數(shù)-i https://pypi.tuna.tsinghua.edu.cn/simple 例如:
,這樣就會(huì)從清華這邊的鏡像去安裝gevent庫。
永久修改
Linux下,修改 ~/.pip/pip.conf (沒有就創(chuàng)建一個(gè)), 修改 index-url至tuna,內(nèi)容如下:
windows下,直接在user目錄中創(chuàng)建一個(gè)pip目錄,如:C:\Users\xx\pip,新建文件pip.ini,內(nèi)容如下
[global]index-url = https://pypi.tuna.tsinghua.edu.cn/simple原文:https://blog.csdn.net/kwame211/article/details/85773260
(3)安裝tensorflow時(shí),如果使用直接安裝速度相對(duì)較慢,采取清華大學(xué)的鏡像會(huì)提高速度。
pip3 install tensorflow-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple由系統(tǒng)自動(dòng)選擇tensorflow-GPU的版本
pip3 install tensorflow-gpu==1.8 -i https://pypi.tuna.tsinghua.edu.cn/simple人為指定tensorflow版本是1.8,并且是GPU版本
(4) 使用國內(nèi)鏡像下載python庫的辦法
以下載pandas為例,終端輸入命令(前提是python正確安裝):
注:–index后面也可以換成別的鏡像,比如http://mirrors.sohu.com/python/
3.Ubuntu卸載python后出現(xiàn)系統(tǒng)崩潰的解決方法
卸載python進(jìn)入系統(tǒng)后,如果只有一個(gè)桌面,解決方法:
1.按ctrl+alt+f1進(jìn)入控制臺(tái)
2.在控制臺(tái)登錄,然后輸入
3.等待安裝結(jié)束,重啟,問題解決
4.Python下關(guān)于tkinter錯(cuò)誤的解決方法
(1) Python下"No module named _tkinter"解決方法
當(dāng)Python出現(xiàn)"No module named _tkinter"的情況,解決方法如下(適用于Ubuntu 16.04、18.04):
sudo apt-get install python-tk python3-tk tk-dev然后安裝我想要的Python版本(這一步一定要在上一步的后面才行,否則還是會(huì)導(dǎo)入失敗):
pyenv install 3.5.6然后就可以導(dǎo)入tkinter:
import tkinter(2)出現(xiàn)"tkinter.TclError: no display name and no $DISPLAY environment variable"的錯(cuò)誤
不同的系統(tǒng)有不同的用戶圖形接口,默認(rèn)的接口在windows下跑是沒有問題的,問題是我們很多的webapp都不在windows上跑,一般在linux上面,所以要更改它的默認(rèn)配置,把模式更改成Agg。
方法1:(我使用這種方案成功解決問題)
在引入pyplot、pylab之前,要先更改matplotlib的后端模式為”Agg”。直接貼代碼:
Import matplotlib matplotlib.use('Agg') # 添加這一行 import matplotlib.pyplot asplt如果不能把 matplotlib.use(‘Agg’)這句代碼放在正確的位置上,就解決不了錯(cuò)誤。
方法2: (我使用這種方案沒成功)
更改配置文件方案:
它的配置文件就是matplotlibrc,在哪里呢?不同系統(tǒng)不一樣,系統(tǒng)是ubuntu,運(yùn)行命令whereis matlotlibrc,可以找到。找不到也沒關(guān)系,一般在/etc目錄下,按如下方法找:
ls后即可以找到matplotlibrc文件。
編輯一下:
sudo vim /etc/matplotlibrc找到backend這里,然后將其改成Agg.
5. 字符串前面加u、r、b的含義
(1) u/U:表示unicode字符串
不是僅僅是針對(duì)中文, 可以針對(duì)任何的字符串,代表是對(duì)字符串進(jìn)行unicode編碼。
一般英文字符在使用各種編碼下, 基本都可以正常解析, 所以一般不帶u;但是中文, 必須表明所需編碼, 否則一旦編碼轉(zhuǎn)換就會(huì)出現(xiàn)亂碼。
建議所有編碼方式采用utf8
(2) r/R:非轉(zhuǎn)義的原始字符串
與普通字符相比,其他相對(duì)特殊的字符,其中可能包含轉(zhuǎn)義字符,即那些,反斜杠加上對(duì)應(yīng)字母,表示對(duì)應(yīng)的特殊含義的,比如最常見的”\n”表示換行,”\t”表示Tab等。而如果是以r開頭,那么說明后面的字符,都是普通的字符了,即如果是“\n”那么表示一個(gè)反斜杠字符,一個(gè)字母n,而不是表示換行了。
以r開頭的字符,常用于正則表達(dá)式,對(duì)應(yīng)著re模塊。
(3) b:bytes
python3.x里默認(rèn)的str是(py2.x里的)unicode, bytes是(py2.x)的str, b”“前綴代表的就是bytes
python2.x里, b前綴沒什么具體意義, 只是為了兼容python3.x的這種寫法
6. 中文的unicode編碼轉(zhuǎn)換為中文
在爬蟲抓取網(wǎng)頁信息時(shí)常需要將類似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"轉(zhuǎn)換為中文,實(shí)際上這是unicode的中文編碼。可用以下方法轉(zhuǎn)換:
s = u'\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8' print(s)以上代碼輸出:“人生苦短,py是岸”
s = r'\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8' s = s.decode('unicode_escape') print (s)以上代碼在Python2輸出:“人生苦短,py是岸”,在Python3會(huì)出錯(cuò):AttributeError: ‘str’ object has no attribute ‘decode’
解決方法:直接去掉decode(‘unicode_escape’)
tips:str通過encode()方法可以編碼為指定的bytes。反過來,當(dāng)從網(wǎng)絡(luò)或磁盤上讀取了字節(jié)流,那么讀到的數(shù)據(jù)就是bytes。要把bytes變?yōu)閟tr,就需要用decode()方法。反之,則使用encode()方法即可!
python在bytes和str兩種類型轉(zhuǎn)換,所需要的函數(shù)依次是encode(),decode()
7.運(yùn)行python文件,給命令行加參數(shù),指定某幾塊GPU
(1) 在代碼中指定GPU的方式為,并非在命令行中這么指定:
os.environ["CUDA_VISIBLE_DEVICES"] = '3' # 指定一塊GPU os.environ["CUDA_VISIBLE_DEVICES"] = '3,4' # 指定多塊GPU,逗號(hào)隔開切記不要單獨(dú)分開指定,例如下面這種方法4號(hào)會(huì)把3號(hào)GPU給覆蓋,因?yàn)檫@是給變量賦值,只能一次性賦值,沒有追加的做法:
os.environ["CUDA_VISIBLE_DEVICES"] = '3' # 指定一塊GPU os.environ["CUDA_VISIBLE_DEVICES"] = '4' # 指定一塊GPU(2) 在命令行中添加參數(shù):
在代碼中分開添加下面代碼:
parser.add_argument('--gpus', default=0, type=str, help='assign gpus') os.environ["CUDA_VISIBLE_DEVICES"] = opt.gpus值得說明的是opt.gpus的這個(gè)gpu就是取自’–gpus’,沒有指定dest所以默認(rèn)去掉了橫杠。有疑問可參考下面一節(jié)argparse模塊的介紹。
8.argparse模塊
摘自:https://blog.csdn.net/weixin_33720452/article/details/88280651
argparse模塊是Python中最重要的模塊之一,其用于命令行參數(shù)解析。此模塊的內(nèi)容非常復(fù)雜,本文只選取其中較為實(shí)用的部分進(jìn)行討論。
使用argparse主要分為三個(gè)部分:
【第一部分】 是創(chuàng)建一個(gè)解析器實(shí)例:
parser = argparse.ArgumentParser()【第二部分】 為多次調(diào)用add_argument函數(shù)添加命令行參數(shù),每一次add_argument函數(shù)的調(diào)用都對(duì)應(yīng)于一個(gè)命令行參數(shù)的配置。
add_argument函數(shù)的主要參數(shù)如下:
第一、二位置參數(shù):用于設(shè)定一個(gè)參數(shù)的單橫線或雙橫線參數(shù)名,或同時(shí)設(shè)定這二者。注意,單橫線參數(shù)名只能使用單個(gè)字母,多于一個(gè)字母的參數(shù)名則必須使用雙橫線。
以下參數(shù)均為add_argument函數(shù)的關(guān)鍵字參數(shù):
action:主要用于將普通參數(shù)修改為開關(guān)參數(shù)。當(dāng)此參數(shù)被設(shè)定為字符串store_true時(shí),當(dāng)前命令行參數(shù)變?yōu)闊o需參數(shù)的開關(guān)參數(shù),如果給出此命令行參數(shù),則參數(shù)值解析為True,如果不給出,則解析為False。反之,如果action設(shè)定為字符串store_false,則開關(guān)參數(shù)給出時(shí),參數(shù)被解析為False,不給出時(shí),才解析為True。
nargs:默認(rèn)情況下,一個(gè)命令行參數(shù)只能接一個(gè)后續(xù)參數(shù)值,而如果將nargs設(shè)定為字符串星號(hào)或加號(hào)時(shí),當(dāng)前參數(shù)將自動(dòng)被解析為列表,且可以在一個(gè)命令行參數(shù)后給出多個(gè)值。星號(hào)與加號(hào)的區(qū)別類似于正則表達(dá)式:星號(hào)代表能夠接受0到任意數(shù)量的參數(shù),而加號(hào)則表示參數(shù)至少需要給出一個(gè)。此參數(shù)也可給定為一個(gè)具體的整數(shù),則參數(shù)數(shù)量必須嚴(yán)格等于該值。
default:用于設(shè)定默認(rèn)值。當(dāng)沒有為這個(gè)命令行參數(shù)給出值時(shí),就使用此默認(rèn)值。
type:給定為一個(gè)函數(shù),默認(rèn)為str。一般可給定為int或float,可將字符串形式的參數(shù)通過指定的函數(shù)轉(zhuǎn)換為其他類型。
required:默認(rèn)為False,此時(shí)當(dāng)不給出這個(gè)參數(shù)時(shí),命令行參數(shù)就將被解析為None。而如果指定為True,則該命令行參數(shù)必須給出,否則程序?qū)?bào)錯(cuò)。
help:指定為一個(gè)幫助字符串。這個(gè)字符串將顯示在調(diào)用-h命令時(shí)。
dest:指定為一個(gè)變量名,用于后續(xù)的parse_args函數(shù)。
【第三部分】 為通過parse_args函數(shù)將參數(shù)解析。
此函數(shù)返回一個(gè)對(duì)象,對(duì)此對(duì)象進(jìn)行屬性訪問即可獲取到各個(gè)命令行參數(shù)。而屬性的名稱遵循以下規(guī)則:如果某個(gè)參數(shù)定義了 dest 參數(shù),則使用這個(gè)參數(shù)作為屬性名,如果沒有,則使用 去掉橫線 的位置參數(shù)名作為屬性名,如-i參數(shù)就對(duì)應(yīng)于i屬性。
以下通過一個(gè)完整的函數(shù)說明上文的各種用法:
import argparsedef _inputArguments():parser = argparse.ArgumentParser() # 第一部分# 第二部分parser.add_argument('-a', '--aa', help = 'Argument: A')parser.add_argument('-b', dest = 'bbb', required = True, nargs = '*', help = 'Argument: B')parser.add_argument('-c', action = 'store_true', help = 'Argument: C')parser.add_argument('-d', type = int, default = 1, help = 'Argument: D')args = parser.parse_args() # 第三部分return args.aa, args.bbb, args.c, args.dprint(_inputArguments())首先,argparse將自動(dòng)定義-h與—help參數(shù),用于生成幫助信息。
而上述代碼定義了四個(gè)參數(shù),A參數(shù)為較普通的參數(shù),通過-a或—aa進(jìn)行給定。
B參數(shù)為一個(gè)必須給出的不定長(zhǎng)參數(shù),給出的各個(gè)參數(shù)之間以空格隔開即可,如:-b 1 2 3,則此參數(shù)就將被解析為:[‘1’, ‘2’, ‘3’]。如果不給出b參數(shù),程序?qū)?bào)錯(cuò),且由于設(shè)定了 dest參數(shù),故解析時(shí)此參數(shù)應(yīng)使用dest參數(shù)所給出的屬性名,本例為bbb,而不是b。
C參數(shù)為一個(gè)開關(guān)參數(shù),如果給出-c,則解析出的args.c為True,否則為False。
D參數(shù)為一個(gè)類型為整形的參數(shù),默認(rèn)值為1,如果給出D參數(shù),則參數(shù)將自動(dòng)套用int函數(shù)轉(zhuǎn)為整數(shù),否則如果不給出此參數(shù),則默認(rèn)為1。
9. import numpy 和 from numpy import * 的區(qū)別
import numpy用numpy的屬性時(shí),需要這么使用numpy.func();
from numpy import *用numpy屬性時(shí),不需要加上numpy.;
以調(diào)用numpy中的random模塊為例,第一種方式要用numpy.random,第二種方式直接用random即可。
但是請(qǐng)?zhí)貏e注意:pep標(biāo)準(zhǔn)推薦使用第一種方式,請(qǐng)?jiān)谌粘J褂弥斜M量使用第一種方法,就比如numpy中random,標(biāo)準(zhǔn)庫中也有random,但是兩者的功能是不同的,使用第二種方式容易造成混淆。
所以一般只在自己定義的python包中使用from ? import *這種方式,自己定義的函數(shù)不要與標(biāo)準(zhǔn)庫中的函數(shù)名相同即可。
注意自己寫Python包或者模塊的時(shí)候需要在文件夾下創(chuàng)建一個(gè)__init__.py 的空文件,否則會(huì)導(dǎo)入包失敗。
10.python進(jìn)程被kill掉后GPU顯存不釋放的問題
kill掉服務(wù)器里兩個(gè)python進(jìn)程,結(jié)果發(fā)現(xiàn)GPU的顯存并沒有被釋放,使用top或者ps -A命令也查看不到是那些進(jìn)程。
解決方法:
1 重新開一個(gè)shell,然后輸入:ps aux|grep user_name|grep python,(注意:這里需要把user_name替換成自己電腦的用戶名),所有該用戶下的python程序就會(huì)顯示出來(很多在用watch命令都不會(huì)顯示的進(jìn)程在這里可以看到);
2 然后再一個(gè)個(gè)用kill命令清理:
kill -9 pid # 或者下面的命令 kill-s 9 pid11.Python中復(fù)制與移動(dòng)的代碼
import shutil shutil.copy('/home/zhz/a.txt', dst_path) # 把a(bǔ).txt文件復(fù)制到dst-path路徑下 shutil.move('/home/zhz/a.txt', dst_path) # 把a(bǔ).txt文件移動(dòng)到dst-path路徑下 shutil.copyfile(filename, dst_path + 'b.txt') # 把filename文件復(fù)制到dst_path路徑下,并改名為b.txt總結(jié)
以上是生活随笔為你收集整理的【Tools】python环境操作笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】pytorch-tensor
- 下一篇: 【c++】0.C++笔记