Pycharm中SSH、SFTP连接远程服务器编辑调试实例
作者:autoreleasepools
需求分析
我目前的需求是将代码部署在服务器上,使用Pycharm的SSH连接Linux服务器,用Pycharm的友好界面远程运行服务器上的Python项目,并且可以对其进行修改。
本篇文章查阅了大量的资料,并希望把整个的流程以及错误处理描述的比较全面。
注意:本文章适用于Pycharm的专业版,免费的社区版本没有远程连接的功能。
SFTP配置
首先第一步来配置SFTP,很多教程在这一步先来设置SSH,SSH设置比较简单,但是Pycharm在设置完SSH后只能担当XShell等软件的角色,并不能满足我们刚才提出的需求(比如说要查看整个项目文件列表并把Python文件展示在Pycharm中),所以第一步我们先来设置SFTP。
创建一个新的Pycharm项目
在最开始做这件事的时候我并不知道本地项目和远程项目的关系,为了事实上Pycharm在这里把本地的项目和远程的项目做了一个映射的关系,通过这些配置,我们既可以把服务器项目的文件拉取到本地项目中,也可以把本地项目的文件上传到服务器项目中,所以为了方便演示,我们创建一个新的项目,这个项目我把他叫做Pycharm_Remote
。
如图所示,我们在本地创建一个最基本的纯Python项目,如果您不清楚具体的过程,可以在搜索引擎中搜索Pycharm 创建项目
关键字来查找教程。
创建项目中使用的Python环境可以先设置为我们本地的Python环境。
创建SFTP相关配置
在导航栏部分找到Tools→Deployment→Configuration
在弹出的窗口中点击左上角加号,选择SFTP
输入你想给这个链接起的名字
点击OK,在新出来的页面中创建一个新的SSH连接,点击三个点,然后点击加号,输入一个新的SSH连接。
其中Visible only for this project指的是是否在不同项目中共享这个SFTP配置,可以按需开启,在SSH设置中输入服务器的IP地址,以及相应的用户名,就如同在XShell中连接服务器那样。
我们可以测试连接,测试成功后点击OK后回到配置SFTP的界面。
如果是使用Windows连接Linux的话,最好可以把Advanced中的编码从GBK改成UTF-8,这样在报错的时候如果服务器那边返回的是中文的错误,Windows这边就不会显示乱码而找不到原因所在(血泪教训),而且如果遇到中文数据文件什么的与服务器也好沟通。
接下来我们配置比较关键的一个环节,需要配置Root Path,这个字段的意思是远程服务器的根路径,比如说我把他设置为/home/a/
,那就意味着我们把a
这个文件夹当做了Pycharm所检测的根路径,将来的项目必须在a
这个文件夹下面Pycharm才能检测得到。
这里还有一个Autodetect的选项,他会自动选择主目录下的用户文件夹作为Root Path,如/home/xiaoming/
,大家按需所取即可。
如上图所示,我们配置了SFTP的所有Connection部分,接下来来到Mapping部分,这部分的用处是将我们本地的文件夹和服务器上的项目文件夹联系映射起来,所以这个地方我们要填入的是我们的项目文件夹,而这里要注意的是要填入相对于Root Path的路径,而不是绝对路径,
比如说我在Root Path部分填入的路径是/nfs/users/xiaoming/jinrong_project
而我真正的项目的绝对路径是/nfs/users/xiaoming/jinrong_project/Finance_Data
这时候我在Mapping的Deployment Path中填入的就是/Finance_Data
第一行的Local Path默认是我们的项目文件夹所在的本地目录。
点击OK,至此我们的SFTP配置就结束了,这时我们可以看项目的右下角展现了我们刚才的配置名称server2。
这时我们可以在导航栏找到Tools→Deployment→Browse Remote Host,在右边就会出现刚才设置的Root Path下的所有文件。(如没有出现,见需要注意的问题)
我们选择相应的文件,双击就可以展现出来了
这个时候我们可以对其进行编辑,在导航栏找到Tools→Deployment→Automatic Upload,打开,这时候我们对文件的更改就会自动上传到服务器上
这时我们已经可以对文件进行编辑了,也可以看到了服务器上的项目文件,其本质我认为是在Pycharm端配置了一个SFTP的传输工具,可是却不能运行,原因是没有配置Python的远程解释器。
需要注意的问题
在创建好SFTP配置后,我们想查看服务器文件的时候会发现右侧的Remote Host会显示Nothing to show,这时候不要担心,如果目录没有配置错误就相信自己,把项目关掉然后重新打开,此时再查看服务器的文件就可以正常显示了。
配置远程解释器
本节的前提条件是服务器上有正常的可以运行的Python环境。
类似于添加Pycharm的解释器环境,在Setting中找到Python Interpreter,点击右上方的小齿轮,选择Add。
在新弹出来的窗口中选择SSH Interpreter,因为我们刚才配置SFTP的时候已经配置了SSH了,这时候我们就选择第二个选项Existing server configuration,选择我们刚才配置的SSH即可。
点击Next,在这一步我们需要让Pycharm找到服务器的Python在哪个地方,并且设置扫描的文件夹。如果不清楚服务器的Python安装在哪个地方,可以使用
which python
命令来查找所使用的Python位置,我这里使用的是Anaconda中的虚拟环境,记得要查看是否是软连接,比如说我这个找到的Python就是个软连接,其真实文件指向的是python3.9
,可以使用
ls -l
命令查看其连接指向
回到刚才的设置,我们在Interpreter中填入上述的Python路径,下面那个选项按需勾选(见需注意的问题),其意思是使用Sudo权限来运行代码。
接下来我们要设置本地与远程同步的项目文件夹,他默认是放在一个/tmp/pycharm_project_283
这种路径,这个路径是临时的,将来很容易出点问题就找不到,这里需要把这个路径和刚才我们在SFTP配置中Mapping的路径(也就是映射到的服务器端的项目文件夹)设置的一样。
点击Finish,完成配置,这时我们的远程Python解释器就成功配置好了。
点击OK,这时我们整个项目就配置上了远程的Python解释器,(在这里还有一点需要注意的,见需注意的问题),就可以运行文件了,但是到这里还没有结束,几乎所有的教程到这里都结束了,说只要运行就可以了,但是实际上当你打开一个服务器的文件想要运行的时候,你会发现出现了这样的错误:
[Errno 2] No such file or directory
这时候你会很无奈,为什么按照上面的配置仔细配好了,他却找不到运行的文件呢?无奈的你去各大网站搜索教程,得到的无非是这几类答案:
- 路径不对,所设置的解释器的路径和Mapping的路径不一致。但是很显然多次检查后,这两个路径在我们的项目中是一致的。
- 设置了多个Mapping,导致冲突。在本项目中我们并没有设置多个Mapping。
- Upload 的功能配置出现问题,更改Automatic Upload选项为on explicit save,原因是修改后没有同步而导致的找不到文件。但是设置之后并没有作用。
其实真正的原因是:我们搞错了需求与实现,通过这种方法Pycharm只能实现将服务器上的文件Download下来到本地,在本地进行修改,同时修改会上传到服务器上,运行的时候是使用远程解释器运行。是不是有点晕了?接下来举个例子来试试。
使用方法
在服务器的项目中现在有一个test.py
文件,路径是/nfs/users/xiaoming/jinrong_project/Finace_Data/test.py
,文件中的内容如下图所示,注意标红的位置。
此时我们右键运行该文件,会报错
[Errno 2] No such file or directory
这时候我们对在右侧服务器文件中找到test.py
,把他下载到本地来。
这时候我们会发现左侧本地项目文件夹下多了一个test.py
,打开这个文件,注意红圈中的不同。
文件仍然与服务器上的test.py
内容相同,只不过下载到了本地,这时候再用相同的方式运行,会发现出现结果了。
这时候如果我们对本地的test.py
更改内容,再运行的话,同样可以出来结果。我们可以注意下图中绿圈圈出来的地方,可以看出我们是成功运行了服务器上的文件,而不是运行的本地的文件(这里我的test.py
在一个新文件夹下,与刚才说的不同,但是不影响)。
这时候我们点开服务器上的test.py
,发现内容已经同步到服务器上,本地端和服务端的两个文件一模一样。
至此我们完成了整个功能的使用流程,如果将来需要更换远程的项目或者本地的项目,重新设置一下Mapping就可以了。
需注意的问题
在添加远程Python Interpreter的时候,有一个选项来确认是否使用Sudo来运行代码,很多教程这时会无脑告诉你要把他勾选上,但是不告诉你为什么,所以记得如果你的服务器不是自己做主的话,一定不要勾选这个,因为你都获得不到Sudo权限,更何况Pycharm了,他会报错Can’t obtain python version,这时候如果你刚才设置编码格式为GBK的时候,就会出现一堆报错乱码,很不容易找到问题所在。
在成功配置好Python解释器后,在这个解释器的Configuration中,我们可以看到其实在添加这个远程Python解释器后,他是自动配置了一个SFTP的,下图中画红圈的地方其实有两个,其中一个是我们刚才配置的Server2
,另一个是这个解释器自动配置的SFTP(这里我把那个删除了,使用的是Server2
),其自动配置的SFTP的路径和Mapping都是默认的,还需要像我们刚才那样设置,注意这里不要用错。
总结
综上,其实我们的需求和实际的实现是有所出入的,所以才导致了各种问题的出现。我想要的需求是直接在服务器上编辑并运行代码,而不是像现在这样在本地编辑代码后上传到服务器运行,我们可以清晰的看到Pycharm的思路是这样的:
- 从服务器上下载代码到本地,在本地进行编辑
- 对本地文件点击运行
- 将修改后的本地文件自动上传到服务器上,调用远程Python解释器来运行服务器文件
所以我目前并不清楚Pycharm是否可以做到不从服务器上下载文件,直接打开服务器的代码进行编辑运行,为什么要多出来下载这一步呢?或许是为了本地与服务器项目的同步开发?印象中VSCode似乎能实现这个功能。
可以看出,Pycharm的Deployment和解释器其实是两个分隔的模块,配置Deployment时并不会配置远程解释器,只能做到阅读和编辑远程代码,而配置解释器的时候会自动生成一个新的SFTP配置,这给第一次配置的人增添了理解难度。所以如果想将流程简单化的话,可以先不设置SFTP配置,直接添加远程Python解释器,然后使用它自动做好的SFTP配置,对其设置Root Path和Mapping。
最后还有一个问题,为什么同样是在服务器运行代码,直接点开服务器的代码运行就会找不到文件,而本地代码上传到服务器后就能找到文件呢?
我的猜想是这样:虽然同样是在服务器运行代码,但是为了简化我们自己的操作,Pycharm把寻找本地文件→上传至服务器→运行服务器代码这三步全部合成在运行这一步上,这就导致我们如果直接运行服务器代码,因为这个代码是服务器上的,所以Pycharm在本地找不到这个文件,就会报错,后面的步骤自然也执行不了了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。