最近接觸的某個資料探勘專案將近尾聲(其實並沒有……),客戶開始關心模型最終部署的問題,希望將模型部署在巨硬雲azure上,他們定期上傳資料,定期跑跑模型,得到**即可。我覺得這應該挺簡單的,客戶把資料上傳到某個資料夾裡,我的程式直接讀取就好啦,然後跑完模型結果儲存在另乙個資料夾裡。結果客戶說,我們的資料會上傳到乙個sftp上,你得從那上面讀取,這樣的話我們可以隨時換vm或者換sftp,至於怎麼實現你們自己搞定。
雖然客戶的需求很有道理,但這讓我有點懵逼了,感覺似乎變成了隔空取物,畢竟我沒法直接在python裡用os操作sftp上的遠端資料夾,也沒法直接用pandas讀取。不過幸好,我們有pysftp這個庫。
pysftp這個庫專門用於連線並操作sftp,我們只需要提供sftp的位址,使用者名稱和密碼,其他的基本跟os的操作一樣了。此庫安裝也非常簡單,直接pip install pysftp即可。
整體的思路非常簡單,我們先來看看整個系統的流程:
使用者的資料上傳至sftp上的input_remote資料夾,我們將其同步到azure上的input_local資料夾中。然後我們的模型從input_local讀取資料,執行,並將結果返回至azure上的output_local資料夾中。隨後我們再將其推送至sftp上的output_remote資料夾,使用者通過該資料夾獲取。這樣一來我們就實現了vm與sftp的分離,兩者隨時想換就能換。
然後就是附上**的環節了:
1. 導入庫
import pysftppysftp用於連線與操作sftp,os用於操作vm上的本地檔案。warnings僅用於過濾掉警告訊息(強迫症患者)。import os
import warnings
warnings.filterwarnings(action='ignore')
2. 遠端檔案同步到本地(sftp -> vm)
cnopts = pysftp.cnopts()開頭兩行是連線選項,不加可能會報錯。然後我們用with語句開啟乙個通往sftp的連線,在pysftp.connection中依次輸入sftp的連線位址、使用者名稱和密碼。使用with的好處是,當我們使用完畢時,會自動關掉這個連線。cnopts.hostkeys = none
with pysftp.connection('***.com', username='******', password='******', cnopts=cnopts) as sftp:
sftp.chdir('./remote_folder') # 變更遠端目標資料夾
print(sftp.listdir()) # 同步前資料夾的內容
print(os.listdir())
sftp.get_d(remotedir='./', localdir='./') # 遠端同步到本地
print(sftp.listdir()) # 同步後資料夾的內容
print(os.listdir())
我們在這裡可以看到,pysftp的操作基本和os別無二致,非常簡單,我們在這一步所做的就是:更改遠端目標資料夾 -> 分別檢視遠端/本地資料夾的內容 -> 使用get_d從遠端同步到本地 -> 再次檢視遠端/本地資料夾的內容。我們看一下結果:
可以看到我們把sftp上的test1.csv同步到了本地。
3. 本地檔案推送至遠端(vm -> sftp)
在這裡,我們先把test1.csv改個名字,改成test2.csv,然後把這個檔案推送到遠端資料夾裡。
os.rename('test1.csv', 'test2.csv')
with pysftp.connection('***.com', username='******', password='******', cnopts=cnopts) as sftp:由於上次使用的with語句在執行結束後關閉了連線,因此我們在這裡要重新變更遠端目標資料夾,我們通過put命令將本地的test2.csv推送至遠端資料夾,執行前後分別檢視一下:sftp.chdir('./remote_folder') # 變更遠端目標資料夾
print(sftp.listdir()) # 檢視
print(os.listdir())
sftp.put('test2.csv') # 推送單個檔案
print(sftp.listdir()) # 再次檢視
print(os.listdir())
可以看到我們把vm上的test2.csv推送到了遠端。如果我們想直接同步整個資料夾的內容的話,我們可以用put_d命令(跟get_d類似)。
通過上述簡單的演示,我們基本上完成了乙個最簡易的sftp-vm的資料打通環節,需要注意的是,同步與推送的過程中,新出現的檔案總是會直接覆蓋已存在的同名檔案(overwrite),所以千萬要注意不要一失足成千古恨。
此外,我們可以把同步與推送的過程寫在乙個with語句裡,並把我們的模型打包嵌入進去,這樣一來我們就基本完成了乙個最簡單的模型部署。
避免當野monkey, 走野路子
一直都想寫點 深 層次的東西,總停留在 層面確實不夠腕,當然啦,我也不是什麼腕。上面這些都可以當個笑話,但其實也是有一定意義的,最少細心的人會想到我要表達的思想 只停留在 層面的不是腕。是的,我是這麼認為的。但至於什麼才算是腕,這個我真不知道。因為我目前也不是腕,所以沒法對乙個壓根不了解的東西做總結...
碼農生涯雜記 4
羊年第一篇部落格,今天來傳播一下正能量好了。過春節回來之後。沒有幾天,乙個同事就辭職了。為什麼辭職呢?簡單的聊了幾句。看別人幹的不如自己好,可是掙得卻比自己多。看別人不幹活,覺得整個公司僅僅有他在幹活。可是卻拿著所有門最低的工資。我相信非常多人都覺得自己是幹的最多。可是拿的卻最少。我們不是否能認這樣...
野路子解決python import的問題
碰到了這樣乙個問題 就是寫乙個註冊的後端程式 然後想分檔案寫,檢視函式寫在main.py裡面 然後註冊程式寫在registeraction.py裡面 然後在registeraction.py裡寫了乙個add user username,password,email 自己除錯的時候,給這個函式傳3個引...