拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PyCharm远程开发全指南:SSH远程解释器与Jupyter服务器配置

做机器学习或者后端开发的同学应该都遇到过这种场景本地代码在Windows或Mac上敲得好好的一跑训练就爆内存数据全在服务器上每次想用Pandas看下结果都得在shell里敲jupyter临时要改个环境变量还得求运维帮忙。PyCharm配置远程解释器配合远程Jupyter服务器就是把IDE的智能提示、调试、单元测试、数据库工具这些本地体验无缝延伸到服务器环境——本地写代码、远程跑逻辑最终执行和可视化全部落在服务器上。这套方案对深度学习训练、数据分析、Django部署、爬虫开发的人特别实用也是我帮团队做统一开发环境时最常用的一套配置。1. 为什么需要远程解释器先想清楚要解决什么问题1.1 本地开发与远程资源的矛盾很多项目不是单机跑通的尤其是深度学习、大数据分析这类任务。代码写在本地数据却堆在服务器上如果按传统方式开发只能在本地装一套一模一样的环境再拉一份数据到本地。这在工程上非常痛苦本地Windows和服务器Linux的库版本经常对不上A机器能跑通的脚本换到B机器就报错数据同步半天training迭代又慢。解决思路有两个方向一是让代码和数据都待在服务器人在本地通过终端操作二是让人在本地用熟悉的IDE但代码运行在服务器环境。前者是纯命令行派的做法但调试不方便写完一堆Python代码想断点看变量靠pdb效率很低。PyCharm远程解释器走的是第二条路核心逻辑其实很简单IDE仍然是本地图形界面代码文件同步到服务器Python进程在服务器上启动解释器路径、包环境、文件读写都发生在远程。你本地看到的控制台输出、调试变量、测试结果都是从远程反馈回来的。1.2 远程解释器 vs 远程桌面 vs 服务器裸写代码很多人会问既然要跑服务器为什么不上远程桌面或者直接在服务器装个桌面环境我试过VNC这类方案体验一般画面延时、字体渲染难看更重要的是IDE里很多快捷键会跟远程桌面的窗口管理冲突。而直接用Vim或Nano在服务器上改代码对小型脚本尚可多个文件重构、全局搜索、调用链追溯就比较吃力了。PyCharm方案的优势在于它保持了“本地IDE 远程执行”的分离。你打开的是正常PyCharm窗口写代码时有自动补全和文档提示调试时可以在本地设置断点PyCharm帮你把断点信息传到远程进程。实际上PyCharm底层就是走SSH连接服务器再通过远端部署插件同步代码对绝大多数开发者来说这条路径的学习成本很低。需要注意这里的远程解释器功能是PyCharm Professional版的能力Community社区版默认不提供这个入口。如果你目前用的是社区版想确认是否支持直接打开Settings里的Project Interpreter看有没有“Add Interpreter On SSH”即可。1.3 为什么远程Jupyter要单独配置解释器解决的是“执行环境在远程”的问题但数据分析还有一个常见的交互工具Jupyter。平时本地启动了Jupyter浏览器里写Notebook很方便但服务器上的Jupyter如果不在浏览器里直接开而是通过IDE内嵌能获得更好的代码编辑能力。PyCharm的远程Jupyter服务器配置就是让你在IDE里打开.ipynb文件时kernel运行在远程服务器上输入输出和图表都通过远程环境返回。这样你既可以享受Notebook的交互式分析又能保留PyCharm的目录结构、Git工具和断点调试能力适合在同一个项目里混合使用脚本和Notebook工作流。2. 环境准备与前置检查配置前最容易忽视的细节2.1 服务端需要准备什么远程解释器的前提是服务器上有可用的SSH服务和Python环境。以Ubuntu服务器为例先确认SSH是否已经安装启动sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now ssh sudo systemctl status ssh注意看状态是不是active (running)。很多云服务器默认有SSH但部分是禁用root直接登录的我会建议创建一个普通用户日常开发就用这个用户避免一些权限问题。Python环境我强烈建议用Anaconda或Miniconda来管理不是必须但对后续做不同项目隔离会省很多事。服务器上安装Miniconda大概是这样wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 export PATH$HOME/miniconda3/bin:$PATH conda --version如果服务器已有Anaconda还要确认conda命令所在的绝对路径后面配置PyCharm解释器时会用到。比如常见的位置是/home/你的用户名/anaconda3/bin/python用which python能看到当前base环境路径。2.2 客户端和网络检查本地PyCharm这边先保证能和服务器建立SSH连接。我习惯先在终端验证一遍不要在IDE里碰运气ssh 用户名服务器IP -p 22能正常登录再继续。如果本地是Windows用PowerShell自带的ssh就行macOS/Linux直接用终端。密码登录虽然简单但每次PyCharm同步都要输密码体验一般。我更推荐配置SSH密钥一次配置长期省事# 本地生成密钥如果已经存在就跳过 ssh-keygen -t ed25519 -C your_emailexample.com -f ~/.ssh/id_ed25519 # 把公钥传到服务器 ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名服务器IP -p 22密钥传上去之后建议测试免密登录能直接进就对了。不要把私钥传到服务器也不要把服务器端口直接暴露到公网不做任何限制安全习惯要养好。2.3 整理好这些信息再动手配置开始前把下面这张表信息记下来PyCharm里需要的字段基本就是这些配置项示例值说明服务器IP10.0.12.34局域网或云主机公网地址SSH端口22默认是22改过就填实际端口登录用户名dev有权限的用户认证方式密钥对或密码建议密钥对远程Python路径/home/dev/anaconda3/bin/pythonconda base环境或者envs下的python同步目录/home/dev/work/myproject对应本地项目根目录Jupyter端口8888远程Jupyter监听端口Jupyter访问token一串随机字符避免用默认无密码模式把这些提前写好后面每一步都有据可查。很多配置失败就是输错了IP或路径回过头检查才发现是低级笔误。3. PyCharm远程解释器配置全流程3.1 新建项目时直接配置SSH解释器如果你是刚开始一个新项目最顺的方式是在新建项目时直接选远程解释器。打开PyCharm点击New Project在项目位置和类型选好之后下方有一个Interpreter选项下拉选择Add Interpreter再选On SSH。此时会弹出连接窗口需要填四项host、port、username、authentication type。这里我用密钥文件举例authentication选择Key PairPrivate key file选到本地私钥路径通常是~/.ssh/id_ed25519如果私钥有口令下面会让你输一遍。填完先点NextPyCharm会自动连接。下一步是选远程解释器类型。这里会根据服务器上的检测情况展示几个选项常见的是System Interpreter、Conda Environment、Virtualenv Environment。如果你服务器用的是Anaconda base环境可以直接选Existing然后在Python interpreter path填/home/dev/anaconda3/bin/pythonPyCharm连接成功后会自动初始化远程环境并扫描已安装的包。首次等待时间取决于网络和服务器性能一般几秒到几十秒都是正常的。扫描完成后会回到项目创建页代码目录默认被标记成远程项目也就是本地编辑的代码会自动对应到服务器某一个目录。3.2 已有项目添加远程解释器更多时候我们是在已有项目里配远程环境操作路径稍不同打开项目进入File Settings Project: 你的项目名 Python Interpreter点右上角的齿轮或Add Interpreter按钮选择On SSH后面选择服务器的步骤与新建项目一样区别在于这里需要确认项目同步目录已有项目没有自动匹配远程目录PyCharm会在连接后提示你设置Path Mapping也就是本地目录和远程目录的对应关系。举个常见配置本地路径D:\workspace\recommend_system远程路径/home/dev/work/recommend_systemPyCharm会根据这个映射关系把本地文件上传到远程对应目录。同时本地编辑保存后也会自动同步到远程Deployment的默认动作。这个环节我吃过亏如果只在Python Interpreter里选了远程解释器但没有正确设置Deployment的Mapping代码跑起来报错说找不到模块甚至执行的是服务器上另一个旧目录的文件。所以配置完后一定要在Tools Deployment Configuration里确认一下Mappings标签页本地和远程路径一一对应。3.3 文件同步与目录映射技巧远程解释器听着高大上本质还是“本地编辑远程执行”文件同步是命脉。PyCharm默认会把项目同步到一个类似/tmp/pycharm_project_xxx的临时目录这个目录我建议改掉原因有两个一是tmp目录在服务器重启后大概率被清空二是路径里带着随机后缀多项目时会很混乱Docker挂载、日志路径都不好配。我更推荐在服务器用户目录下建一个固定的工作目录比如/home/dev/work/项目名。这样设置的同步目录固定后续就算换电脑、换IDE路径还是那个路径不会有惊喜。映射设置路径是Tools Deployment Configuration修改Mappings字段填什么Local path本地项目根目录Deployment path远程目录相对于Root path的路径Web path一般不管如果远程Root path设成/home/dev/work/项目名本地路径是D:\workspace\recommend_system那Deployment path留空即可因为映射到的是同一个层级。上传时右键项目根目录选择Deployment Upload to 服务器名也可以开启自动上传Tools Deployment Automatic Upload。需要注意自动上传是单向的本地文件覆盖远程。如果项目里同时有两个人在改同一台服务器慎开自动上传否则很容易出现互相覆盖。我个人的习惯是本地和远程都以我为主开发服务器只装依赖和跑任务不手动改代码如果需要在服务器上做一些临时验证我会用额外的脚本目录不碰同步目录。3.4 conda虚拟环境的正确姿势用Conda环境配合远程解释器核心就是给PyCharm一个可执行文件路径。远程服务器上先创建环境conda create -n train python3.9然后在PyCharm远程解释器配置里选择Conda EnvironmentExisting environment解释器路径指向/home/dev/miniconda3/envs/train/bin/python有人会在服务器上先conda activate train再启动PyCharm觉得这样环境才对。其实PyCharm通过SSH非交互式shell执行命令用户的.bashrc里conda自动激活逻辑不一定生效。所以最稳妥的方式就是直接指定envs/环境名/bin/python这个绝对路径PyCharm读取这个解释器后会自动把对应的site-packages作为远程包环境。配置完之后在Python Interpreter界面能看到远程环境的包列表。如果新装了包列表没有刷新点一下刷新按钮界面上有刷新图标或者关掉设置重开这一项经常被人忽略导致Import一个能用的包却报红。4. 远程Jupyter服务器配置指南4.1 在服务器上启动一个可用的Jupyter服务远程Jupyter的第一步是让Jupyter在服务器上监听一个端口。最简单的方式conda activate train jupyter lab --ip0.0.0.0 --port8888 --no-browser --notebook-dir/home/dev/work --NotebookApp.tokenmytoken123几个参数的作用要弄清楚。--ip0.0.0.0表示监听服务器所有网卡这样局域网里其他机器才能访问如果只填127.0.0.1就只有服务器本机能访问PyCharm想通过IP直接连会失败。--no-browser是告诉Jupyter不要在服务器上打开浏览器服务器通常没有图形界面。--port8888是端口--notebook-dir是Jupyter文件的根目录建议指向工作目录。--NotebookApp.token是访问令牌相当于密码一定不要留空否则任何人访问8888端口都能操作你的Notebook。如果想以后少记token可以执行一次jupyter server password输入两次密码Jupyter会把hash写入~/.jupyter/jupyter_server_config.json之后启动可以不带token参数。为了不让Jupyter进程在SSH断开后跟着挂掉可以用nohup或者tmux。我比较推荐tmux因为之后看日志、停服务都方便tmux new -s jupyter # 在tmux里启动jupyter jupyter lab --ip0.0.0.0 --port8888 --no-browser --notebook-dir/home/dev/work --NotebookApp.tokenmytoken123 # 按Ctrlb再按d退出会话但进程继续保持4.2 在PyCharm里连接远程Jupyter服务器打开PyCharm进入Settings Project Python Jupyter部分版本在Tools下在Jupyter server里选择Configured Server然后填写URL。填法有两种。一种是直接带上tokenhttp://服务器IP:8888/?tokenmytoken123另一种是只填http://服务器IP:8888然后在浏览器弹出时手动输入token。如果PyCharm所在的本机能够直接访问服务器的8888端口这两种方式都能通。填完后打开一个.ipynb文件右上方的kernel选择会看到远程环境比如train环境。这里要确认一个关键点PyCharm的Jupyter连接只是“访问服务器上的Jupyter服务”但Notebook具体用哪个内核取决于服务器上安装了哪些ipykernel。如果你在服务器base环境启动Jupyter而项目解释器是train环境可能打开Notebook默认用的还是base内核。需要先在服务器上注册内核conda activate train python -m ipykernel install --user --name train --display-name Python (train)这样Jupyter里就能看到名为“Python (train)”的内核在PyCharm里也能切换。不要把这个和“项目解释器”混为一谈它们是两套机制。4.3 用SSH端口转发访问被防火墙挡住的服务实际环境里服务器一般不会轻易开放8888端口。如果端口被防火墙挡了又不想临时开可以走SSH端口转发。这是一种很标准的远程开发技巧把远程服务器的8888端口映射到本地8888端口ssh -N -L 8888:localhost:8888 用户名服务器IP -p 22执行后本地访问http://localhost:8888数据会通过SSH通道转给服务器的localhost:8888。这种方式的好处是即使服务器防火墙没放行8888你也只需要SSH端口通常22通就能访问Jupyter。PyCharm里的URL就填http://localhost:8888/?tokenmytoken123注意SSH端口转发本身不解决token问题token还是要带上。这个方案在本地跑很多服务时都是通用套路比如访问远程MySQL、Redis都能用。4.4 让Jupyter用上远程conda环境如果你想在Notebook里使用某个conda虚拟环境里的包比如tensorflow前面说的内核注册是必须的。手动检查一下内核是否注册成功conda activate train python -m ipykernel install --user --name train --display-name Python (train) jupyter kernelspec list看到train出现在列表里就说明注册成功。如果Notebook内核反复切换报错多半是ipykernel没装在这个环境里重新执行pip install ipykernel最后在PyCharm的Notebook界面上点右上角kernel选择器选中“Python (train)”。此时import tensorflow才会成功因为kernel运行在train环境里。5. 常见问题与排查技巧实录5.1 SSH连接失败怎么快速定位配置远程解释器时报Connection refused或Connection timed out是最常见的。我的建议是不要一直在PyCharm界面里点先回到终端手动验证SSH。可以用ssh -vv打印详细日志看卡在哪一步。现象可能原因排查方法Connection refusedSSH服务没启动/端口不对sudo systemctl status ssh确认端口Connection timed out网络不通或防火墙拦了22端口先ping服务器再检查安全组/防火墙Permission denied密钥不对或密码错误确认用户名重新ssh-copy-idHost key verification failed服务器重装过本地known_hosts有旧记录删除~/.ssh/known_hosts对应行端口转发场景下如果本来能连但突然连不上先检查本地是不是有进程占了同一端口。比如本地已经有个服务占着8888PyCharm转发就会失败这种情况换个本地端口即可比如-L 8890:localhost:8888。5.2 远程解释器显示无效/无法导入包配置完远程解释器PyCharm里能看到远程Python但运行脚本时却提示No module named pandas。出现这种情况先确认当前解释器确实是远程的那个环境。看窗口右下角或Settings里的解释器路径很有可能本地解释器没有切过来或者切到了服务器的base环境而不是项目conda环境。如果解释器路径正确还需要确认包到底装在哪里。可以在PyCharm底部Terminal里运行pip list注意PyCharm的Terminal此时是在本地还是远程取决于Terminal的设置。如果Terminal还是本地的shell直接执行ssh 用户名IP进入远程再跑ssh 用户名服务器IP conda activate train pip list还有一种是PyCharm的包管理面板显示失败。Python Packages面板默认使用当前解释器安装包如果你在面板里点击Install后一直转圈很可能是网络源的问题。我通常直接在服务器终端用国内镜像安装pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas装完在PyCharm里刷新包列表就能看到。5.3 Jupyter能打开但Kernel一直断远程Jupyter最磨人的问题就是页面能打开但一运行单元格就提示Kernel died或者一直Connecting。这类问题分两层排查。第一层是Jupyter服务本身是否正常。在服务器上执行jupyter kernelspec list如果kernel列表为空说明没有可用内核。第二层是资源问题。大模型预处理时内存被打满kernel进程直接被系统杀掉表现为notebook写着写着就断开。用free -h看剩余内存用dmesg | tail -30看有没有OOM记录。如果是内存不足要么换小batch要么扩大交换分区。还有一个小坑有些服务器上Jupyter启动时指定了--NotebookApp.token但PyCharm连接时URL没带token页面一直要输入密码却输不对。建议把token直接拼在URL里一劳永逸。5.4 文件同步覆盖了我的远程修改我在实际项目里遇到过一个比较惨的情况本地和远程同时改了同一个文件PyCharm自动上传把远程的改动覆盖了。原因是自动上传默认以本地为基准它不管远程文件是否更新。解决方法是调整Deployment的同步策略。在Tools Deployment Options里有关于“上传外部更改”的选项可以设置在发现远程文件与本地冲突时询问。保守的做法是关掉Automatic Upload改成每次手动上传或者至少在本地确认没有其他人改服务器文件。另外不要把PyCharm的远程目录当SVN用。它只是同步代码不是真正的版本管理。重要项目一定要用Git本地和服务器都挂在同一个仓库分支上冲突靠Git解决不要靠同步工具。5.5 远程端口被占用怎么处理启动Jupyter报Address already in use说明8888端口已经被其他进程占了。先看谁在用lsof -i:8888如果是自己之前起的jupyter进程可以不管直接复用如果是别人的服务建议换一个端口比如8890。改端口之后PyCharm里的URL也要同步改否则还是连不上。如果端口经常换维护起来很烦我习惯用tmux把启动命令固定成一个脚本比如start_jupyter.sh内容写清楚端口和目录换环境重建时直接执行脚本减少手动输入出错的机会。这里还有一个排查技巧用curl http://127.0.0.1:8888在服务器本机访问一下看返回的是不是Jupyter页面。如果本机也访问不了说明服务没起来如果本机能访问但外网不行检查防火墙和监听IP是否绑了0.0.0.0。这两步能过滤掉80%的Jupyter连接问题。我自己的习惯是每配置完一台远程开发服务器都会把这几个要点记在项目README里服务器IP、SSH端口、解释器路径、Jupyter端口和token、同步目录映射。看起来啰嗦但换电脑、换同事接手时能省大量沟通成本。这套PyCharm远程方案我用了很长时间踩过最深的一个坑是conda环境路径写错导致本地看起来装了一堆包远程跑起来全ModuleNotFoundError。后来所有环境都统一用绝对路径、固定工作目录配合远程Jupyter整个数据分析流程就顺了很多。希望这份配置记录也能让你少走一些弯路。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门