PyCharm with Remote Interpreters

news2024/12/23 17:04:28

文章目录

  • 一: 利用 Docker 镜像搭建
    • 1.编写 Dockerfile
    • 2.构建并配置 Remote Interpreters
    • 3.结论
    • 0.FAQ
  • 二: 利用 SSH + Docker 镜像搭建
    • 1.编写 Dockerfile
    • 2.构建并运行
    • 3.构建镜像
    • 4.运行容器
    • 5.验证并配置
    • 0.FAQ

起因是需要在 M2 芯片的 Mac 上调试基于 Python3.6.1 构建的程序. 而 MacOS预装的是 3.9 的 Python, 为了更好的做环境隔离以及屏蔽特定宿主机 (如 Mac M1/M2 芯片的宿主机) 与特定 Python 版本及其依赖包的版本差异问题, 想着利用 PyCharm 提供的 “连接 Docker 容器中的” 或是 “SSH 到远端 ‘环境机’ 中的” Python Interpreters 特性, 将环境运行在 “Rmeote Intepreters” 中.

主要方式也有二:

  • 要么是直接将环境运行在 Docker 中, 用 PyCharm 的 Docker Intepreter 连接;
  • 要么是将环境运行在以 SSH Intepreter 中, PyCharm 通过 SSH 连接远端运行有 Python3.6.1 的服务, 通过将代码上传至远端服务的方式运行 Py 程序;

简单而快速的记录, 涵盖一些过程中的一些注意点. 将分别介绍这两种实现方式. 首先是环境:

  • Python 版本: 3.6.1
  • PyCharm 版本: latest
  • Docker
  • Hub: 本文相关镜像已上传的 Hub, 点击前往

一: 利用 Docker 镜像搭建

镜像已经推到 Hub, 直接拉下来即可: docker pull caplike/python:v3.6.1

1.编写 Dockerfile

FROM rockylinux:8
MAINTAINER like ""

ARG PYTHON_VERSION=3.6.1

# install related packages
RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && yum makecache \
    && yum install -y wget xz zlib* automake autoconf make gcc gcc-c++ libffi-devel epel-release which \
    && yum clean all

# install version-compatible openssl
RUN wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz \
    && tar zxf openssl-1.0.2h.tar.gz && rm -rf openssl-1.0.2h.tar.gz \
    && cd openssl-1.0.2h \
    && ./config --prefix=/usr/local/openssl-1.0.2 no-zlib \
    && make && make install

# install python 3.6.1
RUN wget https://npm.taobao.org/mirrors/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz \
    && tar -xvf Python-${PYTHON_VERSION}.tar.xz -C /usr/local/ \
    && rm -rf Python-${PYTHON_VERSION}.tar.xz \
    && cd /usr/local/Python-${PYTHON_VERSION}

COPY Setup /usr/local/Python-3.6.1/Modules

RUN cd /usr/local/Python-${PYTHON_VERSION} \
    && ./configure && make && make install

COPY requirements.txt /

# install related packages
RUN yum install -y python3-pip \
    && pip3 install -i https://pypi.doubanio.com/simple/ -r /requirements.txt

其中,

  • 第一层 RUN 主要是为了编译 Python3.6.1, 安装需要的包.
  • 第二层 RUN 是为了解决特定版本的 Python 与 openssl 兼容性问题 (Can’t connect to HTTPS URL because the SSL module is not available), 这里经过反复调试选择了 openssl-1.0.2h 这个版本. 同时需要修改 Python Modules 的 Setup 文件内容以指定该版本的 openssl, 修改的地方是:
    在这里插入图片描述
  • 第三层 RUN 负责编译安装 Python3.6.1
  • 最后一部分则是预装 pip3 以及外置 requirements.txt 中的包

2.构建并配置 Remote Interpreters

# build image
docker build -t caplike/python:v3.6.1 .

构建镜像并启动容器后, 在 PyCharm 中配置即可. 随后 PyCharm 就会尝试基于该镜像启动容器来运行 Py 程序.
在这里插入图片描述

3.结论

这种方式有一个我认为非常致命的问题, 那就是需要在容器构建前提前安装好依赖,不然后续没法安装(因为后续是基于容器运行的镜像,执行完命令就没了). 还是比较耗时, 且编译过程也远远谈不上 “流畅”.
下一个方案: 还是需要通过 SSH 服务保证 Docker 镜像常驻。这样才能保证依赖包的实时安装。

0.FAQ

  • There was a problem confirming the ssl certificate: Can’t connect to HTTPS URL because the SSL module is not available.
    需要安装 openssl
  • pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
    openssl 与 python 的版本不兼容导致: https://www.cnblogs.com/fcc-123/p/12021104.html#circle=on

二: 利用 SSH + Docker 镜像搭建

利用 PyCharm 基于 SSH Intepreter (Python3.6.1 的环境运行于其中) 实现的 Python 环境调试.
镜像已经推到 Hub, 直接拉下来即可: docker pull caplike/python:v3.6.1-ssh

1.编写 Dockerfile

在第一种方式的基础上, 制作包含 ssh 服务的 docker 镜像. 具体方式是在 Dockerfile 中构建完 Python3.6.1 相关环境后, 再进行 ssh 的安装和初始化工作.

FROM rockylinux:8

MAINTAINER like ""

ARG PYTHON_VERSION=3.6.1
ARG PYTHON_HOME=/usr/local/Python-${PYTHON_VERSION}
ARG PYTHON_LIB_DIRECTORY=/usr/local/lib/python3.6
ARG SSH_USERNAME=caplike
ARG SSH_USERPASS=218114

# install openssh-server & passwd
#         rsync: pycharm required
RUN yum install -y openssh-server passwd rsync \
    && useradd ${SSH_USERNAME} \
    && echo -e "$SSH_USERPASS" | passwd --stdin ${SSH_USERNAME} \
    && echo ssh username: ${SSH_USERNAME} && echo ssh userpass: ${SSH_USERPASS} \
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
    && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key \
    && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

EXPOSE 22

ENTRYPOINT ["/usr/sbin/sshd", "-D"]

# install related packages
RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && yum makecache \
    && yum install -y wget xz zlib* automake autoconf make gcc gcc-c++ libffi-devel epel-release which \
    && yum clean all

# install version-compatible openssl
RUN wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz \
    && tar zxf openssl-1.0.2h.tar.gz && rm -rf openssl-1.0.2h.tar.gz \
    && cd openssl-1.0.2h \
    && ./config --prefix=/usr/local/openssl-1.0.2 no-zlib \
    && make && make install

# install python 3.6.1
RUN wget https://npm.taobao.org/mirrors/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz \
    && tar -xvf Python-${PYTHON_VERSION}.tar.xz -C /usr/local/ \
    && rm -rf Python-${PYTHON_VERSION}.tar.xz \
    && cd ${PYTHON_HOME}

COPY Setup ${PYTHON_HOME}/Modules

RUN cd ${PYTHON_HOME} \
    && ./configure && make && make install

# install pip3
RUN yum install -y python3-pip

RUN chown -R ${SSH_USERNAME}:${SSH_USERNAME} ${PYTHON_LIB_DIRECTORY} \
    && rm -rf /run/nologin

2.构建并运行

3.构建镜像

docker build -t caplike/python:v3.6.1-ssh .

4.运行容器

sh run_container_python3.6.1.sh
#!/bin/bash
#description: run container of python3.6.1 and ssh.
#author: like
#date: 2023-05-01
docker run -d -p 20007:22 \
 --name env-python3.6.1-ssh \
 --restart=always \
 caplike/python:v3.6.1-ssh

5.验证并配置

SSH 到本机容器成功:
在这里插入图片描述
并且, 通过 PyCharm 的 SSH Intepreter 连接也是成功:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

0.FAQ

  • Unable to load host key
    sshd 守护进程不能加载主机秘钥文件.
    在这里插入图片描述
    需要生成主机秘钥文件, 在 Dockerfile 倒数第二层末尾追加:
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

  • System is booting up. Unprivileged users are not permitted to log in yet
    在 Dockerfile 末尾新增: RUN rm -rf /run/nologin

  • WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    此报错是由于远程的主机的公钥发生了变化导致的。
    ssh 服务是通过公钥和私钥来进行连接的,它会把每个曾经访问过计算机或服务器的公钥(public key),记录在~/.ssh/known_hosts 中,当下次访问曾经访问过的计算机或服务器时,ssh 就会核对公钥,如果和上次记录的不同,OpenSSH 会发出警告。
    清除本地 /Users/<用户名>/.ssh/known_hosts 对应 ip 的秘钥信息.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/481997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天一道算法练习题--Day18 第一章 --算法专题 --- ----------前缀树

前缀树 字典树也叫前缀树、Trie。它本身就是一个树型结构&#xff0c;也就是一颗多叉树&#xff0c;学过树的朋友应该非常容易理解&#xff0c;它的核心操作是插入&#xff0c;查找。删除很少使用&#xff0c;因此这个讲义不包含删除操作。 截止目前&#xff08;2020-02-04&a…

bootloader编写——MCU固件升级系列2(STM32)

本系列将从升级流程、boot代码编写、APP代码编写以及固件打包来介绍&#xff0c;硬件选用STM32F407ZGT6&#xff08;手里只有&#xff09;&#xff0c;来完成这系列教程。 前言 开发STM32固件升级并编写Bootloader时&#xff0c;需要注意以下几个关键点&#xff1a; 熟悉硬件和…

数据结构篇四:栈

文章目录 前言1.栈1.1 栈的概念及结构1.2 栈的实现 2.栈功能的解析及实现2.1 栈的创建2.2 初始化2.3 入栈2.4 出栈2.5 检查栈是否为空2.6 获取栈顶元素2.7 栈中的有效元素个数2.8 销毁 3.代码实现3.1 Stack.h3.2 Stack.c3.3 test.c 4.总结 前言 前面学习的一些结构都比较普通&a…

13 | visual studio与Qt的结合

1 前提 Qt 5.15.2 visual studio 2019 vsaddin 2.8 2 具体操作 2.1 visual studio tool 2.1.1 下载 https://visualstudio.microsoft.com/zh-hans/downloads/2.1.2 安装 开发

推荐算法实战项目:WideDeep原理以及案例实战(附完整 Python 代码)

本文要介绍的是Google于2016年提出的Wide&Deep模型&#xff0c;此模型的提出对业界产生了非常大的影响&#xff0c;不仅其本身成功地应用在多家一线互联网公司&#xff0c;而且其后续的改进工作也一直延续至今。 Wide&Deep模型正如其名&#xff0c;分别包含了Wide部分…

golang - 函数的使用

核心化编程 为什么需要函数&#xff1f; 代码冗余问题不利于代码维护函数可以解决这个问题 函数 函数&#xff1a;为完成某一功能的程序指令&#xff08;语句&#xff09;的集合&#xff0c;称为函数 在 Go 中&#xff0c;函数分为&#xff1a;自定义函数&#xff08;自己写…

Apache Solr Velocity模板注入RCE

Apache Solr Velocity模板注入RCE 一、Apache Solr介绍 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口,用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引,也可以通过http get操作提出查找请求,并得到XML格式的返回结果。…

【openFrameworks】跨平台的 C++ 开源框架 | oF 文件结构 | 图形基础介绍

&#x1f4ad; 写在前面&#xff1a;本章我们将介绍一个非常好用的跨平台的 C 开源框架 —— openFrameworks。它是一个开源的跨平台的 C工具包&#xff0c;方便开发者创建出一个更简单和直观的框架&#xff0c;擅长开发图像和动画。 &#x1f4dc; 本章目录&#xff1a; 0x0…

SpringBoot集成SpringSecurity从0到1搭建权限管理详细过程(认证+授权)

前言 最近工作需要给一个老系统搭建一套权限管理&#xff0c;选用的安全框架是SpringSecurity&#xff0c;基本上是结合业务从0到1搭建了一套权限管理&#xff0c;然后想着可以将一些核心逻辑抽取出来写一个权限通用Demo&#xff0c;特此记录下。 文章目录 前言1、SpringSecuri…

CSS中4个定位设计与实现

1.相对定位 说明&#xff1a;相对原来元素的定位。开启定位后&#xff0c;元素层级高&#xff0c;会置于最上层 作用&#xff1a;用于元素的微调&#xff0c;不会脱离文档流 1.1代码实现 <!DOCTYPE html> <html lang"zh"> <head><meta charset…

外卖项目优化-01-redis缓存短信验证码、菜品数据、Spring Cache(注解开发缓存)、(注解开发)缓存套餐数据

文章目录 外卖项目优化-01课程内容前言1. 环境搭建1.1 版本控制解决branch和tag命名冲突 1.2 环境准备 2. 缓存短信验证码2.1 思路分析2.2 代码改造2.3 功能测试 3. 缓存菜品信息3.1 实现思路3.2 代码改造3.2.1 查询菜品缓存3.2.2 清理菜品缓存 3.3 功能测试3.4 提交并推送代码…

每日一题133——环形链表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

5. 操作系统基础

5. 操作系统基础 常考面试题 说说你对进程的理解⭐⭐⭐ 程序是指令、数据及其组织形式的描述,而进程则是程序的运行实例,包括程序计数器、寄存器和变量的当前值。 Linux的进程结构,一般分为三部分:代码段、数据段(.data与.bss)和堆栈段。 代码段用于存放程序代码,如果有…

【计算机图形学基础教程】面向对象程序设计基础

构造函数与析构函数 例1 设计一个长方形CRectangle类&#xff0c;调用类的成员函数计算长方形的周长和面积。 #include <iostream>class CRectangle { public:CRectangle(); // 声明默认构造函数CRectangle(int width, int height); // 声明带…

Python基础合集 练习21 (错误与异常处理语句)

‘’‘try: block1 except[ExceptionName]: block2 ‘’’ block1:执行代码,表示可能会出现错误的代码块 ExceptionName: 表示要捕获的异常名称,为可选参数.如果不指定异常名称,则表示捕获所有异常 block2:表示发生异常时执行的代码块 while True: try: num int(input(请输…

测试时,可快速调用 Mapper 的 Mapper Generator

项目 Gitee 地址&#xff1a;MapperGenerator (当前使用的是 JDK17&#xff0c;JDK8 的需改下 pom.xml 文件&#xff09; 解决的问题&#xff1a;SpringBootTest 启动太慢 使用方式 假设有这样一个数据库&#xff0c;名为 a SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;…

推荐 3 个令你惊艳的 GitHub 项目

昨日 GitHub Trending 上榜的开源项目&#xff0c;基于 AI 技术提高你的生产力。借助 AI 你能搭建自己的数字人、搭建自己的法律助手、文档分析助手。 本期推荐开源项目目录&#xff1a; 1. 数字人开源项目 2. AI 法律助手 3. 为 PDF 文档打招一个聊天机器人 01 数字人开源项目…

作业区域工服穿戴识别算法 yolov7

作业区域工服穿戴识别系统基于yolov7视频智能图像识别技术&#xff0c;作业区域工服穿戴识别算法模型利用深度学习技术&#xff0c;不需人为干预自动识别现场施工作业人员未按要求穿工作服行为&#xff0c;代替后台工作人员执勤时的人眼判断。YOLOv7 研究团队提出了基于 ELAN 的…

win10 全屏秒退

问题 程序比较老&#xff0c;而电脑配置很新窗口化无任何问题&#xff0c;但是一旦全屏就退出 解决方案 猜测可能是兼容性的问题。 定位发现&#xff1a;禁用全屏优化。 方式如下&#xff1a;右键配置。选择兼容性。 选择禁用全屏优化。以兼容性运行这个程序。

什么是图数据库Neo4j

什么是图数据库Neo4j 所谓的图数据库一般由节点和关系构成&#xff0c;neo4j是其中的一种 在寻求数据的关联性中优于传统数据库mysql 且neo4j支持上亿级别的节点和关系 传统图运算一般在内存中进行&#xff0c;无法处理整个知识图谱&#xff0c;neo4j可以在磁盘中完成图运算…