Pycharm中SSH、SFTP連接遠(yuǎn)程服務(wù)器編輯調(diào)試實(shí)例
需求分析
我目前的需求是將代碼部署在服務(wù)器上,使用Pycharm的SSH連接Linux服務(wù)器,用Pycharm的友好界面遠(yuǎn)程運(yùn)行服務(wù)器上的Python項(xiàng)目,并且可以對(duì)其進(jìn)行修改。
本篇文章查閱了大量的資料,并希望把整個(gè)的流程以及錯(cuò)誤處理描述的比較全面。
注意:本文章適用于Pycharm的專(zhuān)業(yè)版,免費(fèi)的社區(qū)版本沒(méi)有遠(yuǎn)程連接的功能。
SFTP配置
首先第一步來(lái)配置SFTP,很多教程在這一步先來(lái)設(shè)置SSH,SSH設(shè)置比較簡(jiǎn)單,但是Pycharm在設(shè)置完SSH后只能擔(dān)當(dāng)XShell等軟件的角色,并不能滿(mǎn)足我們剛才提出的需求(比如說(shuō)要查看整個(gè)項(xiàng)目文件列表并把Python文件展示在Pycharm中),所以第一步我們先來(lái)設(shè)置SFTP。
創(chuàng)建一個(gè)新的Pycharm項(xiàng)目
在最開(kāi)始做這件事的時(shí)候我并不知道本地項(xiàng)目和遠(yuǎn)程項(xiàng)目的關(guān)系,為了事實(shí)上Pycharm在這里把本地的項(xiàng)目和遠(yuǎn)程的項(xiàng)目做了一個(gè)映射的關(guān)系,通過(guò)這些配置,我們既可以把服務(wù)器項(xiàng)目的文件拉取到本地項(xiàng)目中,也可以把本地項(xiàng)目的文件上傳到服務(wù)器項(xiàng)目中,所以為了方便演示,我們創(chuàng)建一個(gè)新的項(xiàng)目,這個(gè)項(xiàng)目我把他叫做Pycharm_Remote
。
如圖所示,我們?cè)诒镜貏?chuàng)建一個(gè)最基本的純Python項(xiàng)目,如果您不清楚具體的過(guò)程,可以在搜索引擎中搜索Pycharm 創(chuàng)建項(xiàng)目
關(guān)鍵字來(lái)查找教程。
創(chuàng)建項(xiàng)目中使用的Python環(huán)境可以先設(shè)置為我們本地的Python環(huán)境。
創(chuàng)建SFTP相關(guān)配置
在導(dǎo)航欄部分找到Tools→Deployment→Configuration
在彈出的窗口中點(diǎn)擊左上角加號(hào),選擇SFTP
輸入你想給這個(gè)鏈接起的名字
點(diǎn)擊OK,在新出來(lái)的頁(yè)面中創(chuàng)建一個(gè)新的SSH連接,點(diǎn)擊三個(gè)點(diǎn),然后點(diǎn)擊加號(hào),輸入一個(gè)新的SSH連接。
其中Visible only for this project指的是是否在不同項(xiàng)目中共享這個(gè)SFTP配置,可以按需開(kāi)啟,在SSH設(shè)置中輸入服務(wù)器的IP地址,以及相應(yīng)的用戶(hù)名,就如同在XShell中連接服務(wù)器那樣。
我們可以測(cè)試連接,測(cè)試成功后點(diǎn)擊OK后回到配置SFTP的界面。
如果是使用Windows連接Linux的話(huà),最好可以把Advanced中的編碼從GBK改成UTF-8,這樣在報(bào)錯(cuò)的時(shí)候如果服務(wù)器那邊返回的是中文的錯(cuò)誤,Windows這邊就不會(huì)顯示亂碼而找不到原因所在(血淚教訓(xùn)),而且如果遇到中文數(shù)據(jù)文件什么的與服務(wù)器也好溝通。
接下來(lái)我們配置比較關(guān)鍵的一個(gè)環(huán)節(jié),需要配置Root Path,這個(gè)字段的意思是遠(yuǎn)程服務(wù)器的根路徑,比如說(shuō)我把他設(shè)置為/home/a/
,那就意味著我們把a
這個(gè)文件夾當(dāng)做了Pycharm所檢測(cè)的根路徑,將來(lái)的項(xiàng)目必須在a
這個(gè)文件夾下面Pycharm才能檢測(cè)得到。
這里還有一個(gè)Autodetect的選項(xiàng),他會(huì)自動(dòng)選擇主目錄下的用戶(hù)文件夾作為Root Path,如/home/xiaoming/
,大家按需所取即可。
如上圖所示,我們配置了SFTP的所有Connection部分,接下來(lái)來(lái)到Mapping部分,這部分的用處是將我們本地的文件夾和服務(wù)器上的項(xiàng)目文件夾聯(lián)系映射起來(lái),所以這個(gè)地方我們要填入的是我們的項(xiàng)目文件夾,而這里要注意的是要填入相對(duì)于Root Path的路徑,而不是絕對(duì)路徑,
比如說(shuō)我在Root Path部分填入的路徑是/nfs/users/xiaoming/jinrong_project
而我真正的項(xiàng)目的絕對(duì)路徑是/nfs/users/xiaoming/jinrong_project/Finance_Data
這時(shí)候我在Mapping的Deployment Path中填入的就是/Finance_Data
第一行的Local Path默認(rèn)是我們的項(xiàng)目文件夾所在的本地目錄。
點(diǎn)擊OK,至此我們的SFTP配置就結(jié)束了,這時(shí)我們可以看項(xiàng)目的右下角展現(xiàn)了我們剛才的配置名稱(chēng)server2。
這時(shí)我們可以在導(dǎo)航欄找到Tools→Deployment→Browse Remote Host,在右邊就會(huì)出現(xiàn)剛才設(shè)置的Root Path下的所有文件。(如沒(méi)有出現(xiàn),見(jiàn)需要注意的問(wèn)題)
我們選擇相應(yīng)的文件,雙擊就可以展現(xiàn)出來(lái)了
這個(gè)時(shí)候我們可以對(duì)其進(jìn)行編輯,在導(dǎo)航欄找到Tools→Deployment→Automatic Upload,打開(kāi),這時(shí)候我們對(duì)文件的更改就會(huì)自動(dòng)上傳到服務(wù)器上
這時(shí)我們已經(jīng)可以對(duì)文件進(jìn)行編輯了,也可以看到了服務(wù)器上的項(xiàng)目文件,其本質(zhì)我認(rèn)為是在Pycharm端配置了一個(gè)SFTP的傳輸工具,可是卻不能運(yùn)行,原因是沒(méi)有配置Python的遠(yuǎn)程解釋器。
需要注意的問(wèn)題
在創(chuàng)建好SFTP配置后,我們想查看服務(wù)器文件的時(shí)候會(huì)發(fā)現(xiàn)右側(cè)的Remote Host會(huì)顯示Nothing to show,這時(shí)候不要擔(dān)心,如果目錄沒(méi)有配置錯(cuò)誤就相信自己,把項(xiàng)目關(guān)掉然后重新打開(kāi),此時(shí)再查看服務(wù)器的文件就可以正常顯示了。
配置遠(yuǎn)程解釋器
本節(jié)的前提條件是服務(wù)器上有正常的可以運(yùn)行的Python環(huán)境。
類(lèi)似于添加Pycharm的解釋器環(huán)境,在Setting中找到Python Interpreter,點(diǎn)擊右上方的小齒輪,選擇Add。
在新彈出來(lái)的窗口中選擇SSH Interpreter,因?yàn)槲覀儎偛排渲肧FTP的時(shí)候已經(jīng)配置了SSH了,這時(shí)候我們就選擇第二個(gè)選項(xiàng)Existing server configuration,選擇我們剛才配置的SSH即可。
點(diǎn)擊Next,在這一步我們需要讓Pycharm找到服務(wù)器的Python在哪個(gè)地方,并且設(shè)置掃描的文件夾。如果不清楚服務(wù)器的Python安裝在哪個(gè)地方,可以使用
which python
命令來(lái)查找所使用的Python位置,我這里使用的是Anaconda中的虛擬環(huán)境,記得要查看是否是軟連接,比如說(shuō)我這個(gè)找到的Python就是個(gè)軟連接,其真實(shí)文件指向的是python3.9
,可以使用
ls -l
命令查看其連接指向
回到剛才的設(shè)置,我們?cè)?strong>Interpreter中填入上述的Python路徑,下面那個(gè)選項(xiàng)按需勾選(見(jiàn)需注意的問(wèn)題),其意思是使用Sudo權(quán)限來(lái)運(yùn)行代碼。
接下來(lái)我們要設(shè)置本地與遠(yuǎn)程同步的項(xiàng)目文件夾,他默認(rèn)是放在一個(gè)/tmp/pycharm_project_283
這種路徑,這個(gè)路徑是臨時(shí)的,將來(lái)很容易出點(diǎn)問(wèn)題就找不到,這里需要把這個(gè)路徑和剛才我們?cè)赟FTP配置中Mapping的路徑(也就是映射到的服務(wù)器端的項(xiàng)目文件夾)設(shè)置的一樣。
點(diǎn)擊Finish,完成配置,這時(shí)我們的遠(yuǎn)程Python解釋器就成功配置好了。
點(diǎn)擊OK,這時(shí)我們整個(gè)項(xiàng)目就配置上了遠(yuǎn)程的Python解釋器,(在這里還有一點(diǎn)需要注意的,見(jiàn)需注意的問(wèn)題),就可以運(yùn)行文件了,但是到這里還沒(méi)有結(jié)束,幾乎所有的教程到這里都結(jié)束了,說(shuō)只要運(yùn)行就可以了,但是實(shí)際上當(dāng)你打開(kāi)一個(gè)服務(wù)器的文件想要運(yùn)行的時(shí)候,你會(huì)發(fā)現(xiàn)出現(xiàn)了這樣的錯(cuò)誤:
[Errno 2] No such file or directory
這時(shí)候你會(huì)很無(wú)奈,為什么按照上面的配置仔細(xì)配好了,他卻找不到運(yùn)行的文件呢?無(wú)奈的你去各大網(wǎng)站搜索教程,得到的無(wú)非是這幾類(lèi)答案:
- 路徑不對(duì),所設(shè)置的解釋器的路徑和Mapping的路徑不一致。但是很顯然多次檢查后,這兩個(gè)路徑在我們的項(xiàng)目中是一致的。
- 設(shè)置了多個(gè)Mapping,導(dǎo)致沖突。在本項(xiàng)目中我們并沒(méi)有設(shè)置多個(gè)Mapping。
- Upload 的功能配置出現(xiàn)問(wèn)題,更改Automatic Upload選項(xiàng)為on explicit save,原因是修改后沒(méi)有同步而導(dǎo)致的找不到文件。但是設(shè)置之后并沒(méi)有作用。
其實(shí)真正的原因是:我們搞錯(cuò)了需求與實(shí)現(xiàn),通過(guò)這種方法Pycharm只能實(shí)現(xiàn)將服務(wù)器上的文件Download下來(lái)到本地,在本地進(jìn)行修改,同時(shí)修改會(huì)上傳到服務(wù)器上,運(yùn)行的時(shí)候是使用遠(yuǎn)程解釋器運(yùn)行。是不是有點(diǎn)暈了?接下來(lái)舉個(gè)例子來(lái)試試。
使用方法
在服務(wù)器的項(xiàng)目中現(xiàn)在有一個(gè)test.py
文件,路徑是/nfs/users/xiaoming/jinrong_project/Finace_Data/test.py
,文件中的內(nèi)容如下圖所示,注意標(biāo)紅的位置。
此時(shí)我們右鍵運(yùn)行該文件,會(huì)報(bào)錯(cuò)
[Errno 2] No such file or directory
這時(shí)候我們對(duì)在右側(cè)服務(wù)器文件中找到test.py
,把他下載到本地來(lái)。
這時(shí)候我們會(huì)發(fā)現(xiàn)左側(cè)本地項(xiàng)目文件夾下多了一個(gè)test.py
,打開(kāi)這個(gè)文件,注意紅圈中的不同。
文件仍然與服務(wù)器上的test.py
內(nèi)容相同,只不過(guò)下載到了本地,這時(shí)候再用相同的方式運(yùn)行,會(huì)發(fā)現(xiàn)出現(xiàn)結(jié)果了。
這時(shí)候如果我們對(duì)本地的test.py
更改內(nèi)容,再運(yùn)行的話(huà),同樣可以出來(lái)結(jié)果。我們可以注意下圖中綠圈圈出來(lái)的地方,可以看出我們是成功運(yùn)行了服務(wù)器上的文件,而不是運(yùn)行的本地的文件(這里我的test.py
在一個(gè)新文件夾下,與剛才說(shuō)的不同,但是不影響)。
這時(shí)候我們點(diǎn)開(kāi)服務(wù)器上的test.py
,發(fā)現(xiàn)內(nèi)容已經(jīng)同步到服務(wù)器上,本地端和服務(wù)端的兩個(gè)文件一模一樣。
至此我們完成了整個(gè)功能的使用流程,如果將來(lái)需要更換遠(yuǎn)程的項(xiàng)目或者本地的項(xiàng)目,重新設(shè)置一下Mapping就可以了。
需注意的問(wèn)題
在添加遠(yuǎn)程Python Interpreter的時(shí)候,有一個(gè)選項(xiàng)來(lái)確認(rèn)是否使用Sudo來(lái)運(yùn)行代碼,很多教程這時(shí)會(huì)無(wú)腦告訴你要把他勾選上,但是不告訴你為什么,所以記得如果你的服務(wù)器不是自己做主的話(huà),一定不要勾選這個(gè),因?yàn)槟愣极@得不到Sudo權(quán)限,更何況Pycharm了,他會(huì)報(bào)錯(cuò)Can’t obtain python version,這時(shí)候如果你剛才設(shè)置編碼格式為GBK的時(shí)候,就會(huì)出現(xiàn)一堆報(bào)錯(cuò)亂碼,很不容易找到問(wèn)題所在。
在成功配置好Python解釋器后,在這個(gè)解釋器的Configuration中,我們可以看到其實(shí)在添加這個(gè)遠(yuǎn)程Python解釋器后,他是自動(dòng)配置了一個(gè)SFTP的,下圖中畫(huà)紅圈的地方其實(shí)有兩個(gè),其中一個(gè)是我們剛才配置的Server2
,另一個(gè)是這個(gè)解釋器自動(dòng)配置的SFTP(這里我把那個(gè)刪除了,使用的是Server2
),其自動(dòng)配置的SFTP的路徑和Mapping都是默認(rèn)的,還需要像我們剛才那樣設(shè)置,注意這里不要用錯(cuò)。
總結(jié)
綜上,其實(shí)我們的需求和實(shí)際的實(shí)現(xiàn)是有所出入的,所以才導(dǎo)致了各種問(wèn)題的出現(xiàn)。我想要的需求是直接在服務(wù)器上編輯并運(yùn)行代碼,而不是像現(xiàn)在這樣在本地編輯代碼后上傳到服務(wù)器運(yùn)行,我們可以清晰的看到Pycharm的思路是這樣的:
- 從服務(wù)器上下載代碼到本地,在本地進(jìn)行編輯
- 對(duì)本地文件點(diǎn)擊運(yùn)行
- 將修改后的本地文件自動(dòng)上傳到服務(wù)器上,調(diào)用遠(yuǎn)程Python解釋器來(lái)運(yùn)行服務(wù)器文件
所以我目前并不清楚Pycharm是否可以做到不從服務(wù)器上下載文件,直接打開(kāi)服務(wù)器的代碼進(jìn)行編輯運(yùn)行,為什么要多出來(lái)下載這一步呢?或許是為了本地與服務(wù)器項(xiàng)目的同步開(kāi)發(fā)?印象中VSCode似乎能實(shí)現(xiàn)這個(gè)功能。
可以看出,Pycharm的Deployment和解釋器其實(shí)是兩個(gè)分隔的模塊,配置Deployment時(shí)并不會(huì)配置遠(yuǎn)程解釋器,只能做到閱讀和編輯遠(yuǎn)程代碼,而配置解釋器的時(shí)候會(huì)自動(dòng)生成一個(gè)新的SFTP配置,這給第一次配置的人增添了理解難度。所以如果想將流程簡(jiǎn)單化的話(huà),可以先不設(shè)置SFTP配置,直接添加遠(yuǎn)程Python解釋器,然后使用它自動(dòng)做好的SFTP配置,對(duì)其設(shè)置Root Path和Mapping。
最后還有一個(gè)問(wèn)題,為什么同樣是在服務(wù)器運(yùn)行代碼,直接點(diǎn)開(kāi)服務(wù)器的代碼運(yùn)行就會(huì)找不到文件,而本地代碼上傳到服務(wù)器后就能找到文件呢?
我的猜想是這樣:雖然同樣是在服務(wù)器運(yùn)行代碼,但是為了簡(jiǎn)化我們自己的操作,Pycharm把尋找本地文件→上傳至服務(wù)器→運(yùn)行服務(wù)器代碼這三步全部合成在運(yùn)行這一步上,這就導(dǎo)致我們?nèi)绻苯舆\(yùn)行服務(wù)器代碼,因?yàn)檫@個(gè)代碼是服務(wù)器上的,所以Pycharm在本地找不到這個(gè)文件,就會(huì)報(bào)錯(cuò),后面的步驟自然也執(zhí)行不了了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python爬蟲(chóng)之對(duì)CSDN榜單進(jìn)行分析
這篇文章主要介紹了Python爬蟲(chóng)之對(duì)CSDN榜單進(jìn)行分析,文章有詳細(xì)代碼,簡(jiǎn)單易懂,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2023-01-01python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法
這篇文章主要介紹了python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01如何使用python讀取Excel指定范圍并轉(zhuǎn)為數(shù)組
python處理數(shù)據(jù)文件的途徑有很多種,下面這篇文章主要給大家介紹了關(guān)于如何使用python讀取Excel指定范圍并轉(zhuǎn)為數(shù)組的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Keras SGD 隨機(jī)梯度下降優(yōu)化器參數(shù)設(shè)置方式
這篇文章主要介紹了Keras SGD 隨機(jī)梯度下降優(yōu)化器參數(shù)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python環(huán)境搭建以及Python與PyCharm安裝詳細(xì)圖文教程
PyCharm是一種PythonIDE,帶有一整套可以幫助用戶(hù)在使用Python語(yǔ)言開(kāi)發(fā)時(shí)提高其效率的工具,這篇文章主要給大家介紹了關(guān)于Python環(huán)境搭建以及Python與PyCharm安裝的詳細(xì)圖文教程,需要的朋友可以參考下2024-03-03python標(biāo)準(zhǔn)庫(kù)模塊之json庫(kù)的基礎(chǔ)用法
json庫(kù)是處理JSON格式的Python標(biāo)準(zhǔn)庫(kù),json庫(kù)主要包括兩類(lèi)函數(shù),操作函數(shù)和解析函數(shù),下面這篇文章主要給大家介紹了關(guān)于python標(biāo)準(zhǔn)庫(kù)模塊之json庫(kù)的基礎(chǔ)用法,需要的朋友可以參考下2022-06-06