windows一键启动jupyter

windows一键启动jupyter

jupyter简介

Jupyter是一个开源的交互式计算环境,主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写:Julia、Python和R,这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学计算、机器学习等任务,Jupyter是一个非常有用的工具,因为它提供了一个交互式的环境,让您可以探索数据、编写代码并实时查看结果。

Jupyter的主要特点

交互性

Jupyter环境允许用户以交互式的方式编写和执行代码。用户可以一次性执行一条代码或一块代码,然后立即查看结果。这对于数据分析和探索性编程非常有用。

支持多种编程语

虽然最初是以支持Julia、Python和R为主,但实际上Jupyter可以支持众多编程语言。用户可以通过安装相应的内核来扩展Jupyter的语言支持。

Notebook文档

Jupyter Notebook是Jupyter环境的一种文件格式,它允许用户在同一个文档中混合编写可执行的代码、可视化输出、文本说明、公式和图像等内容。这使得Jupyter成为了一个非常适合分享和展示分析过程的工具。

数据可视化

Jupyter环境内嵌了丰富的数据可视化工具,使用户可以方便地创建图表、图像和动画,以更好地理解数据。

灵活性

Jupyter可以在本地计算机上安装运行,也可以在云端服务器上部署。这使得用户可以根据自己的需求选择适合的运行环境。

Jupyter 的安装

在Linux上安装Jupyter Notebook

  1. 安装Python: 大多数Linux发行版都自带Python,您可以通过以下命令检查是否已经安装:

    shell 复制代码
    python --version

    如果未安装Python或需要更新版本,请根据您的发行版使用适当的包管理工具进行安装或更新。

  2. 安装pip: 如果未安装pip,可以使用以下命令安装:

    shell 复制代码
    sudo apt-get update
    sudo apt-get install python3-pip
  3. 安装Jupyter Notebook: 在终端中运行以下命令来安装Jupyter Notebook:

    shell 复制代码
    python3 -m pip install jupyter
  4. 启动Jupyter Notebook: 在终端中运行以下命令来启动Jupyter Notebook:

    shell 复制代码
    jupyter notebook

在Windows上安装Jupyter Notebook

  1. 安装Python和pip: 可以从Python官方网站(https://www.python.org/downloads/windows/)下载Python安装程序,并确保勾选"Add Python to PATH"选项。

  2. 安装Jupyter Notebook: 在命令提示符(Command Prompt)中运行以下命令来安装Jupyter Notebook:

    shell 复制代码
    python -m pip install jupyter
  3. 启动Jupyter Notebook: 在命令提示符中运行以下命令来启动Jupyter Notebook:

    shell 复制代码
    jupyter notebook

总结一下,不管是linux还是windows安装都是一下几个步骤:

   1. 首先安装python环境,windows则配置一下环境
   2. 再安装pip环境
   3. 通过pip命令安装jupyter模块
   4. 运行jupyter

如何在windows下一键启动安装jupyter?

背景(为什么要这么做?)

实际情况是我们想做一个在线的python编辑器,需要用户能再浏览器进行在线编程python,并且能实时输出python代码执行的结果。有人可能会说为什么不直接通过代码进行执行服务器上的python命令来执行python代码呢,但是这样其实做不到实时返回执行结果的,比如一个for循环打印无法实现,比如用户需要输入,接受输入以后展示输出结果。

设计思路(怎么做?)

问题

  • windows执行意见安装一般都是一个exe程序点击一键启动,如何打包exe
  • 启动如何安装pythonpip的环境

解决问题

  1. 目前打包exe的方式一般有两种: 使用 pyinstaller 打包 Python 程序为 .exe和使用 Visual Studio 打包 C# 程序为 .exe,这里我们对python代码比较熟悉,选择使用pyinstaller
  2. 首先pythonwindows的安装包,如果通过python代码去安装python.exe,体验非常不好,需用用户去点击安装。这里我们换个思路,找到python官网提供免安装版本的python包。

不要开心的太早了,免安装版本的python包不没有pip模块的,所以就得考虑安装pip模块。python安装pip模块见:免安装版本python安装pip模块

总结

我们再总结一下前面的思路,进行一个比较详细的设计思路:

  1. 下载官方python进行解压,并且将 get-pip.py 放入到python文件夹下
  2. 首先判断python是否已经安装过,未安装则配置python 环境变量
  3. 首先判断pip模块是否已经安装过,未安装通过python代码安装pip模块
  4. 安装完以后pip模块后,再配置pip的环境变量
  5. 为了防止安装jupyter超时,通过python代码更换镜像源为国内镜像源
  6. 使用pip进行安装jupyter
  7. 启动jupyter

此步骤则是完整的代码逻辑,其实这里并不完整,因为你安装了jupyter ,你肯定不想每次使用的时候都去点击exe来启动jupyter,所以是需要做一个windows的开机自启动的,这个后面会降到如何做开机自启。

代码实现

jupyter 打包exe 代码实现

jupyter.py

python 复制代码
import os
import subprocess
import traceback
import socket
from utils.logutils import log

python_path = "python"
scripts_path = "python\Scripts"


def is_installed(model):
    try:
        # 尝试运行 python 命令
        result = subprocess.run([model, "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        # 检查返回结果
        if result.returncode == 0:
            return True
        else:
            return False
    except FileNotFoundError:
        return False


def install_pip_module():
    if not is_installed("pip"):
        # 安装 pip 模块
        try:
            new_path = os.path.join(os.getcwd(), f'python')
            subprocess.check_call(["python", f'{new_path}\get-pip.py'])
            log.info("成功安装 pip 模块")
        except subprocess.CalledProcessError:
            log.info("安装 pip 模块时出错")


def configure_path(path):
    # Assuming the path to add is '/path/to/python/bin'
    new_path = os.path.join(os.getcwd(), f'{path}')
    # 获取当前的PATH环境变量
    current_path = os.environ["PATH"]
    # 在当前的PATH后追加新路径,并使用os.pathsep分隔
    new_path_value = current_path + os.pathsep + new_path
    # 更新环境变量
    os.environ["PATH"] = new_path_value


def configure_path_env_variable():
    if not is_installed("pip") and is_installed("python"):
        env_var_name = "PATH"
        python_path = os.path.join(os.getcwd(), f'python')
        scripts_path = os.path.join(os.getcwd(), f'python\Scripts')
        env_var_value = python_path + os.pathsep + scripts_path
        try:
            # 设置环境变量
            configure_path(f'python')
            configure_path(f'python\Scripts')
            subprocess.check_call(["setx", env_var_name, f"%{env_var_name}%;{env_var_value}"])
            log.info(f"成功追加环境变量: {env_var_name}={env_var_value}")
        except subprocess.CalledProcessError:
            log.info(f"追加环境变量时出错: {env_var_name}")


def change_mirror_source():
    if not is_installed("pip"):
        # 更换镜像源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
        mirror_url = "https://pypi.tuna.tsinghua.edu.cn/simple"
        os.system('pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple')
        log.info(f"已更换镜像源:{mirror_url}")


def install_jupyter():
    if not is_installed("jupyter"):
        # 使用 pip 安装 jupyter
        try:
            subprocess.check_call(["python", "-m", "pip", "install", "jupyter_kernel_gateway"])
            log.info("成功安装 Jupyter")
        except subprocess.CalledProcessError:
            log.info("安装 Jupyter 时出错")


def start_jupyter():
    # 启动 Jupyter  start /B jupyter kernelgateway
    cmd = ['jupyter', 'kernelgateway', '--KernelGatewayApp.ip=0.0.0.0', '--KernelGatewayApp.port=18012',
           '--KernelGatewayApp.allow_credentials=*', '--KernelGatewayApp.allow_headers=*',
           '--KernelGatewayApp.allow_methods=*', '--KernelGatewayApp.allow_origin=*']
    try:
        subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE, shell=True)
        log.info("Jupyter kernel gateway 启动成功")
    except OSError as error:
        log.error(error)


def is_running():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(3)
        result = s.connect_ex(('127.0.0.1', 18012))
        s.close()
        if result == 0:
            log.info("AI-Link.exe is already running or port conflict!")
            return True
        else:
            return False
    except:
        log.info("Exception of is_running:{0}".format(traceback.format_exc()))
        return False


def main_process():
    if not is_running():
        # 配置环境变量
        configure_path_env_variable()
        # 安装pip模块
        install_pip_module()
        # 更换镜像源
        change_mirror_source()
        # 使用pip进行安装jupyter
        install_jupyter()
        # 启动jupyter
        start_jupyter()


if __name__ == "__main__":
    main_process()

logutils.py

python 复制代码
# -*- coding: utf-8 -*-
import time
import win32api
import win32con


class Log(object):
    def write(self, level, msg):
        date = time.strftime("%Y-%m-%d", time.localtime())
        log_file = r"{0}{1}{2}".format( "jupyter.", date, ".log")
        line = "{0} {1} {2}\n".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), level, msg)
        with open(log_file, 'a', encoding='utf-8') as f:
            f.write(line)

    def info(self, msg):
        self.write("INFO", msg)

    def error(self, msg):
        self.write("ERROR", msg)

    @staticmethod
    def notice_info(msg: str):
        win32api.MessageBox(0, f"{msg}", "警告", win32con.MB_ICONWARNING)


log = Log()

jupyter 打包exe 实现windows自启

思路
  1. 首先要了解windows如何实现开机自启
  2. 如何通过python代码去打包exe 程序实现开机自启
解决方案

一. 要实现在 Windows 开机时自动启动 .exe 程序,你可以通过以下几种方式来设置:

  1. 将程序快捷方式添加到启动文件夹
    • 按下 Win + R 键,打开"运行"对话框。
    • 输入 shell:startup,然后按回车,这将打开当前用户的启动文件夹。
    • 在启动文件夹中创建程序的快捷方式,可以通过右键点击程序的 .exe 文件,然后选择"发送到" -> "桌面(创建快捷方式)",然后将生成的快捷方式拖放到启动文件夹中。
  2. 注册表编辑器
    • 按下 Win + R 键,打开"运行"对话框。
    • 输入 regedit,然后按回车,打开注册表编辑器。
    • 导航到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
    • 右键点击右侧的空白处,选择"新建" -> "字符串值"。
    • 将新建的字符串值命名为你想要的名称,然后修改其数值数据为程序的完整路径,比如 C:\path\to\your\program.exe
  3. 任务计划程序
    • 搜索并打开"任务计划程序"。
    • 在左侧导航栏,选择"创建基本任务"。
    • 按照向导的指示,设置任务的名称和触发条件,选择"启动程序"作为操作类型。
    • 指定要启动的程序的路径,然后完成创建任务的过程。

以上三个方式都可以实现开机自启,先看第二个方案需要改注册表,理论上代码可行,第三个方案需要设计任务计划,通过代码实现相对可行性较低,再看第一个所有的windows 系统,startup文件目录相对固定,只需要创建快捷方式即可,相对简单,如是我们采用方案一。

二. 通过代码实现开启及自启

代码实现可行,主要问题就是如果不是使用管理员权限执行exe的话就需要强制获取一下admin的管理员权限.

代码实现:

installer.py

python 复制代码
# -*- coding: utf-8 -*-
import os
import traceback
import ctypes
import sys
import win32com.client as client

shell = client.Dispatch("WScript.Shell")
from utils.logutils import log


def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except Exception as e:
        log.error(e)
        return False


def create_shortcut():
    try:
        filename = os.path.join(os.getcwd(), f'jupyter.exe')
        lnkName = f"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\jupyter.lnk"
        shortcut = shell.CreateShortCut(lnkName)
        shortcut.TargetPath = filename
        shortcut.save()
    except:
        log.info("Exception of creating a shortcut:{0}".format(traceback.format_exc()))


def jupyter_installer():
    if is_admin():
        create_shortcut()  # 配置自启动服务
    else:
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)


if __name__ == '__main__':
    try:
        jupyter_installer()
    except:
        log.info("Service initialization failed:{0}".format(traceback.format_exc()))

pyinstaller 打包exe

python 复制代码
pyinstaller -F install.py
python 复制代码
pyinstaller -F jupyter.py

源码地址以及打包后的exe文件

源码地址路径

https://github.com/LBJWt/windows-jupyter

打包后的完整exe的文件下载地址

https://download.csdn.net/download/wagnteng/88245132

相关推荐
无名之逆2 小时前
lombok-macros
开发语言·windows·后端·算法·面试·rust·大学期末
牛奔4 小时前
windows nvm 切换node版本后,npm找不到
前端·windows·npm·node.js
leigm1236 小时前
深度学习使用Anaconda打开Jupyter Notebook编码
人工智能·深度学习·jupyter
测试者家园9 小时前
ChatGPT助力数据可视化与数据分析效率的提升(一)
软件测试·人工智能·信息可视化·chatgpt·数据挖掘·数据分析·用chatgpt做软件测试
小奥超人10 小时前
Excel粘贴复制不完整的原因以及解决方法
windows·经验分享·microsoft·excel·办公技巧
Want59511 小时前
Java圣诞树
开发语言·python·信息可视化
PittDing14 小时前
【更新】Docker新手入门教程2:在Windows系统通过compose创建多个mysql镜像并配置应用
windows·mysql·docker
love530love18 小时前
Windows 11 中利用 WSL - Linux 虚拟环境部署 ChatTTS-Enhanced 项目教程
linux·运维·windows
kaixin_啊啊18 小时前
Windows电脑异地SSH远程连接苹果MacOS小主机Mac mini详细教程
windows·macos·ssh
爱研究的小牛18 小时前
Pika Labs技术浅析(四):数据可视化
神经网络·计算机视觉·信息可视化·aigc