2020-01-01

版本管理 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚷缭,一起剝皮案震驚了整個(gè)濱河市饮亏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阅爽,老刑警劉巖路幸,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異付翁,居然都是意外死亡简肴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)百侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)砰识,“玉大人,你說(shuō)我怎么就攤上這事佣渴”枥牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵辛润,是天一觀的道長(zhǎng)膨处。 經(jīng)常有香客問(wèn)我,道長(zhǎng)砂竖,這世上最難降的妖魔是什么真椿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乎澄,結(jié)果婚禮上突硝,老公的妹妹穿的比我還像新娘。我一直安慰自己置济,他們只是感情好解恰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舟肉,像睡著了一般修噪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上路媚,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天黄琼,我揣著相機(jī)與錄音,去河邊找鬼。 笑死脏款,一個(gè)胖子當(dāng)著我的面吹牛围苫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撤师,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剂府,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了剃盾?” 一聲冷哼從身側(cè)響起腺占,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痒谴,沒(méi)想到半個(gè)月后衰伯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡积蔚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年意鲸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尽爆。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怎顾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漱贱,到底是詐尸還是另有隱情槐雾,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布幅狮,位于F島的核電站蚜退,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏彪笼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一蚂且、第九天 我趴在偏房一處隱蔽的房頂上張望配猫。 院中可真熱鬧,春花似錦杏死、人聲如沸泵肄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腐巢。三九已至,卻和暖如春玄括,著一層夾襖步出監(jiān)牢的瞬間冯丙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工遭京, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胃惜,地道東北人泞莉。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像船殉,于是被迫代替她去往敵國(guó)和親鲫趁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • score=input('請(qǐng)輸入您的年齡') print(type(score)) score=int(score...
    小清新_f81e閱讀 184評(píng)論 0 0
  • 所有內(nèi)容出自魚(yú)C論壇https://fishc.com.cn/ 小甲魚(yú)課程 Mac:復(fù)制上一條語(yǔ)句 ctrl+N ...
    開(kāi)水倩閱讀 118評(píng)論 0 0
  • Math.PI 圓周率 Math.round()四舍五入 Math.random() 生成一個(gè)0到1之間的浮點(diǎn)數(shù)...
    大馬虎閱讀 256評(píng)論 0 0
  • 熱詞分析在公眾趨勢(shì)分析利虫、輿情分析有很寬廣的應(yīng)用挨厚,我們來(lái)看看怎么從一個(gè)TXT文件中分析出文章的熱詞出來(lái),我們采用流行...
    位右虛左閱讀 2,137評(píng)論 0 2
  • Python第二天 for循環(huán) 結(jié)果 字符串操作 字符串的替換 strip去空格操作 join將列表變成字符串 元...
    仲夏貳拾閱讀 143評(píng)論 0 0