版本管理 pipenv
先前的python 之版本控制 中介紹過(guò)pyenv和virtualenv,個(gè)人一直使用virtualenv码俩,非常習(xí)慣和順手。基本思路是需要使用某一版本的python解釋器去官網(wǎng)上下載所需要版本抹锄,然后用virtualenv從該版本創(chuàng)建出所需的虛擬環(huán)境。所有的解釋器都是筆者自己手動(dòng)管理荠藤。而pipenv相當(dāng)于集pyenv virtualenv于一身伙单。完整信息參見(jiàn)pipenv官網(wǎng)。
安裝pipenv
# mac下可以brew
brew install pipenv
# 直接pip安裝哈肖,避免和系統(tǒng)默認(rèn)產(chǎn)生沖突
pip install --user pipenv
# 可以在機(jī)器的 .bashrc 中配置補(bǔ)全功能
eval "$(pipenv --completion)"
筆者直接用brew安裝的吻育,結(jié)果引來(lái)了很多麻煩,后面詳述淤井。
與virtualenv 相比布疼,pipenv會(huì)自動(dòng)去解析你當(dāng)前目錄下的 Pipfile文件,由此去安裝依賴币狠,配置進(jìn)而取代requirements.txt的管理游两。但是pipenv仍然需要用戶去下載不同的python解釋器,如果你指定一個(gè)你本地沒(méi)有的解釋器來(lái)創(chuàng)建虛擬環(huán)境則會(huì)報(bào)出:
Warning: Python 3.7 was not found on your system…
You can specify specific versions of Python with:
? $ pipenv --python path/to/python
使用
Pipfile文件的格式在官網(wǎng)中詳細(xì)給出了总寻,此處簡(jiǎn)單示例:
[[source]]
url = "https://mirrors.aliyun.com/pypi/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = "*"
[dev-packages]
django = "*"
[requires]
python_version = "3.6"
在本地測(cè)試目錄下依次執(zhí)行:
# 創(chuàng)建虛擬env環(huán)境類似 virtualenv -p python3.6
# 并且安裝 Pipfile的包器罐,并生成對(duì)應(yīng)的Pipfile.lock文件
pipenv install
# 激活當(dāng)前目錄對(duì)應(yīng)的env
pipenv shell
# 安裝package到當(dāng)前evn中,同時(shí)會(huì)更新Pipfile渐行,Pipfile.lock
pipenv install your_package
# 導(dǎo)出所安裝的package信息到requirements.txt中
pipenv lock -r > requirements.txt
# 回歸系統(tǒng)環(huán)境轰坊,用deactive終端顯示上退出,實(shí)際也是退出祟印,但再次pipenv shell 會(huì)顯示當(dāng)前終端已經(jīng)激活了虛擬環(huán)境
exit
其實(shí)如果virtualenv如果使用的比較熟練肴沫,可以不必轉(zhuǎn)用pipenv。自己手動(dòng)管理所有的解釋環(huán)境蕴忆,在哪里颤芬,用哪個(gè),心里都非常清楚套鹅。pipenv默認(rèn)是在user的home目錄下的 .local文件中創(chuàng)建了虛擬env環(huán)境站蝠,就是讓版本控制更便捷。
出現(xiàn)問(wèn)題
OSError
pipenv install初始化創(chuàng)建虛擬環(huán)境時(shí)如果如果出現(xiàn)了OSError導(dǎo)致失敗卓鹿,多數(shù)是ReadTimeoutError菱魔,在初次創(chuàng)建虛擬環(huán)境時(shí)候會(huì)去files.pythonhosted.org下載安裝pip,setuptools等吟孙,如果網(wǎng)絡(luò)不好丟包比較嚴(yán)重就會(huì)超時(shí)報(bào)錯(cuò)澜倦。
自動(dòng)升級(jí)
筆者是brew install pipenv的聚蝶,結(jié)果默認(rèn)下載了python3.6的解釋器安裝了,出現(xiàn)了一個(gè)問(wèn)題是系統(tǒng)全局python默認(rèn)還是2.7藻治,但是默認(rèn)的pip是3.x(因?yàn)楣P者原本機(jī)器上有幾個(gè)python3.x的版本碘勉,且映射了bin/ 到PATH中)∽眩恢復(fù)過(guò)程很是難受验靡,不過(guò)倒是發(fā)現(xiàn)很多以前忽略的東西:
MacOS下系統(tǒng)python所在路徑
/System/Library/Frameworks/Python.framework/Versions/ 所以如果想要恢復(fù),核心問(wèn)題在找到默認(rèn)pip是指向何處的吸占,然后通過(guò)修改連接晴叨,PATH去改變pip的搜尋順序。
Linux Tips
which & whereis
是否遇到過(guò) which a 命令有輸出矾屯,但是whereis a 沒(méi)有輸出?
which 是搜尋你的命令 a 使用的是PATH中那個(gè)一路徑下的命令初厚。
whereis則搜尋的是user.cs_path件蚕,可以用sysctl user.cs_path 查看,二者是不一樣的
PATH
修改PATH是很多時(shí)候經(jīng)常做的事产禾,當(dāng)時(shí)筆者安裝過(guò)幾個(gè)版本的python3.x后就把其下屬的bin/映射到PATH里了排作,問(wèn)題是,PATH是有序的亚情。echo ${path/''/'\n'} 查看其中的順序就是使用命令a 時(shí)的搜尋順序妄痪,先到先用。所以即便多個(gè)目錄下有 pip命令楞件,當(dāng)筆者把安裝的python3.x的bin/接在PATH前時(shí)衫生,就會(huì)把全局pip不小心改成了python3.x下的。
export PATH=/usr/local/bin:$PATH
export PATH=$PATH:/usr/local/bin
此二者是不一樣的土浸。
docker volume 相對(duì)路徑
先前碰到一個(gè)compose文件罪针,沒(méi)有多看就啟動(dòng)了其中的 pg,其data是映射到我本地的黄伊,結(jié)果我想找其掛載地址發(fā)現(xiàn)用的是相對(duì)路徑泪酱。之前習(xí)慣默認(rèn)是指定絕對(duì)的宿主機(jī)掛載路徑,結(jié)果用相對(duì)路徑找不到了还最。
docker inspect container_name 查看處的路徑是CentOS下docker的容器路徑墓阀。MacOS下根本沒(méi)有
可以用
docker volume 相關(guān)命令操作這種相對(duì)路徑創(chuàng)建的掛載
docker volume ls 查看列表
docker volume rm volume_name 刪除
sz & rz
這是兩個(gè)好東西,多數(shù)同學(xué)平時(shí)遠(yuǎn)程拷貝文件估計(jì)與筆者相同拓轻,用scp斯撮。但是如果是跳板機(jī)器轉(zhuǎn)過(guò)去的呢?如果跳了不止一次呢悦即?慢慢用 scp一步一步導(dǎo)出吮成。橱乱。。如果是一個(gè)大點(diǎn)的文件粱甫,傳一次10分鐘泳叠,多跳幾次。茶宵。危纫。。乌庶。种蝶。
改用 sz 和 rz 吧。直接就從本地上傳到瞒大,或者下載了螃征,連scp基礎(chǔ)的那些輸入項(xiàng)都免了。
具體的安裝配置過(guò)程就不詳述了透敌,item2上怎么配置隨處可找盯滚。
Python
python-jenkins
python操作Jenkins的包,參見(jiàn)官網(wǎng)說(shuō)明 酗电。接口倒是挺全的魄藕,有些地方用起來(lái)也不難,就是返回的數(shù)據(jù)沒(méi)找到文檔撵术,Jenkins官方是否提供筆者沒(méi)找到背率。只能參照界面顯示去看,比較費(fèi)時(shí)嫩与。
筆者最難以忍受的是:
def jenkins_request(self, req, add_crumb=True, resolve_auth=True):
? ? try:
? ? ? ? if resolve_auth:
? ? ? ? ? ? self._maybe_add_auth()
? ? ? ? if add_crumb:
? ? ? ? ? ? self.maybe_add_crumb(req)
? ? ? ? return self._response_handler(
? ? ? ? ? ? self._request(req))
? ? except req_exc.HTTPError as e:
? ? ? ? # Jenkins's funky authentication means its nigh impossible to
? ? ? ? # distinguish errors.
? ? ? ? if e.response.status_code in [401, 403, 500]:
? ? ? ? ? ? raise JenkinsException(
? ? ? ? ? ? ? ? 'Error in request. ' +
? ? ? ? ? ? ? ? 'Possibly authentication failed [%s]: %s' % (
? ? ? ? ? ? ? ? ? ? e.response.status_code, e.response.reason)
? ? ? ? ? ? )
? ? ? ? elif e.response.status_code == 404:
? ? ? ? ? ? raise NotFoundException('Requested item could not be found')
? ? ? ? else:
? ? ? ? ? ? raise
? ? except req_exc.Timeout as e:
? ? ? ? raise TimeoutException('Error in request: %s' % (e))
? ? except URLError as e:
? ? ? ? # python 2.6 compatibility to ensure same exception raised
? ? ? ? # since URLError wraps a socket timeout on python 2.6.
? ? ? ? if str(e.reason) == "timed out":
? ? ? ? ? ? raise TimeoutException('Error in request: %s' % (e.reason))
? ? ? ? raise JenkinsException('Error in request: %s' % (e.reason))
這里的 jenkins_request 是在執(zhí)行 build_job操作時(shí)候寝姿,下兩層調(diào)用的,也是這個(gè)包通用和jenkins交互的請(qǐng)求方法蕴纳。這個(gè)方法里會(huì)拋出一個(gè) Possibly authentication failed 異常会油。
這簡(jiǎn)直就是 坑爹到一定境地的做法。當(dāng)時(shí)以為是在調(diào)用 build_job 構(gòu)建時(shí)必須要傳token古毛,很多其他的地方對(duì)這個(gè)錯(cuò)也沒(méi)詳細(xì)說(shuō)明翻翩。因?yàn)榇饲肮P者測(cè)試調(diào)用build_job是成功的,但是后面死活不行稻薇,這種提示讓筆者在用戶認(rèn)證這里轉(zhuǎn)了n圈嫂冻。
然后調(diào)試進(jìn)入發(fā)現(xiàn)是上面拋出的,再看上面注釋發(fā)發(fā)現(xiàn)這種異常是因?yàn)镴enkins's funky authentication means its nigh impossible to distinguish errors. 發(fā)生了一個(gè)不能辨別的錯(cuò)誤塞椎。后面解決問(wèn)題的方式是桨仿,從之前構(gòu)建成功的構(gòu)建中拉出信息對(duì)比,發(fā)現(xiàn)一個(gè)參數(shù)傳入的不合法最后才發(fā)現(xiàn)是一個(gè)不合法額參數(shù)造成案狠。
這里提供一種思路服傍,往后如果碰到一個(gè)地方執(zhí)行成功钱雷,而后不成功,不妨把成功的快照數(shù)據(jù)拉出來(lái)仔細(xì)對(duì)比吹零,說(shuō)不定就查處了問(wèn)題
此外還有可能引發(fā)上述報(bào)錯(cuò)的是 create_job 指定的config_xml必須是 utf-8編碼罩抗,否則也是上面額錯(cuò)誤〔右危總之套蒂,上述錯(cuò)誤要依據(jù)具體調(diào)用方法查找,多數(shù)是參數(shù)引起的茫蛹。
python-gitlab
python用以和gitlab交互的bao操刀。首先gitlab官方給出了API文檔 其中的說(shuō)明非常詳盡。
使用包的說(shuō)明文檔 也非常詳盡婴洼。
例如Porject相關(guān)接口
projects = gl.projects.list()
只給出了幾個(gè)參數(shù)骨坑,作為過(guò)濾條件,實(shí)際上柬采,project是objects.ProjectManager(self) 實(shí)例卡啰,在定義中可以用作filter的參數(shù)很多,但是說(shuō)明文檔中沒(méi)有給出警没,可以去gitlab的接口文檔中查看,基本上都能滿足需求振湾。
_list_filters = ('search', 'owned', 'starred', 'archived', 'visibility',
? ? ? ? ? ? ? ? ? ? 'order_by', 'sort', 'simple', 'membership', 'statistics',
? ? ? ? ? ? ? ? ? ? 'with_issues_enabled', 'with_merge_requests_enabled',
? ? ? ? ? ? ? ? ? ? 'with_custom_attributes')
tips
函數(shù)注解
之前寫(xiě)函數(shù)習(xí)慣性是添加注釋杀迹,其實(shí)還可以添加注解:
def func(x: int, y: callable) -> str:
? ? pass
# print結(jié)果{'x': <class 'int'>, 'return': <class 'str'>, 'y': <built-in function callable>}
print(add.__annotations__)
這種形式,只是注解押搪,是不會(huì)其他任何附加影響的树酪,不會(huì)說(shuō)你注解了x是int,傳入str報(bào)錯(cuò)大州。Python是弱類型P铩!
函數(shù)參數(shù)
先前的函數(shù)基礎(chǔ)知識(shí)說(shuō)說(shuō)過(guò) *args厦画,**kwargs兩種參數(shù)疮茄,倘若要一個(gè)函數(shù),其調(diào)用只能是關(guān)鍵字形式傳入?yún)?shù)可以如下定義:
def func(*, x, y, **kwargs):
? ? pass
# 只能是關(guān)鍵字形式傳入?yún)?shù)
func(x=1, y=2, option_param=3)
__str__ & __repr__
上次被人問(wèn)到這兩個(gè)根暑,本來(lái)想這東西多數(shù)書(shū)上都有力试,但是還真有人問(wèn),那就說(shuō)吧排嫌,一個(gè)是在python 的shell下直接裸給一個(gè)實(shí)例時(shí)調(diào)用畸裳,一個(gè)是print打印時(shí)調(diào)用。
>>>a = A()
# 調(diào)用__repr__
>>>a
# 調(diào)用__str__
>>>print(a)
注意:
如果只定義了一個(gè)__repr__ 此時(shí) 裸給和print都調(diào)用__repr__
如果只定義了一個(gè)__str__淳地,裸調(diào)返回內(nèi)置默認(rèn)的怖糊,即平時(shí)看到給出地址號(hào)的那種帅容,print則調(diào)用__str__。
————————————————
版權(quán)聲明:本文為CSDN博主「Inevitable-Neo」的原創(chuàng)文章伍伤,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議并徘,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/duxiangwushirenfei/article/details/81088338