利用python和gpt写一个conda环境可视化管理工具

news/2025/2/25 17:52:54

最近在学习python,由于不同的版本之间的差距较大,如果是用环境变量来配置python的话,会需要来回改,于是请教得知可以用conda来管理,但是conda在管理的时候老是要输入命令,感觉也很烦,于是让gpt帮写了一个很简陋的conda环境管理界面(纯属个人学习,不喜勿喷),下面是最终的效果:

1、左侧的激活按钮没什么用

2、中间的输入框是要安装的包名,输入完成之后,点击安装即可把包安装到对应的环境,比如我在ai312对应的输入框中输入numpy,那么就是在a312这个env下面安装numpy的包,其实背后执行的命令就是:conda install numpy -n ai312 -y

3、下面的两个输入框,第一个是环境名称,比如ai312,第二个是python的版本,比如3.8

直接上代码:

import os
import subprocess
import json
import re
import tkinter as tk
from tkinter import messagebox, simpledialog
from tkinter import scrolledtext
import threading

class CondaEnvManager:
    def __init__(self, root):
        self.root = root
        self.root.title("Conda 环境管理器")
        self.root.geometry("600x400")

        # 获取 Conda 路径
        self.conda_path = self.get_conda_path()

        self.env_list_frame = tk.Frame(self.root)
        self.env_list_frame.pack(pady=10, fill=tk.BOTH, expand=True)

        self.create_env_frame = tk.Frame(self.root)
        self.create_env_frame.pack(pady=10)

        self.create_env_label = tk.Label(self.create_env_frame, text="创建新环境:")
        self.create_env_label.grid(row=0, column=0, padx=5)

        self.new_env_name = tk.Entry(self.create_env_frame)
        self.new_env_name.grid(row=0, column=1, padx=5)

        # 新增 Python 版本输入框
        self.python_version_label = tk.Label(self.create_env_frame, text="Python 版本:")
        self.python_version_label.grid(row=1, column=0, padx=5)

        self.python_version_entry = tk.Entry(self.create_env_frame)
        self.python_version_entry.grid(row=1, column=1, padx=5)

        self.create_env_button = tk.Button(self.create_env_frame, text="创建", command=self.create_env)
        self.create_env_button.grid(row=0, column=2, padx=5)

        self.refresh_envs()

        # 日志输出框
        self.log_output = scrolledtext.ScrolledText(self.root, width=70, height=15)
        self.log_output.pack(pady=10, fill=tk.BOTH, expand=True)

    def get_conda_path(self):
        # 提示用户输入 Conda 路径
        while True:
            conda_path = simpledialog.askstring("Conda 路径", "请输入 conda.exe 的完整路径:")
            if not conda_path:
                messagebox.showerror("错误", "Conda 路径不能为空,请重试。")
                continue

            # 检查路径是否有效
            if os.path.isfile(conda_path) and "conda" in conda_path:
                return conda_path
            else:
                messagebox.showerror("错误", f"路径 '{conda_path}' 无效,请重试。")

    def refresh_envs(self):
        for widget in self.env_list_frame.winfo_children():
            widget.destroy()

        try:
            # 使用用户输入的 Conda 路径
            result = subprocess.run([self.conda_path, 'env', 'list', '--json'], capture_output=True, text=True)
            output = result.stdout

            # 提取 JSON 数据
            try:
                json_match = re.search(r'\{.*\}', output, re.DOTALL)
                if not json_match:
                    raise ValueError("No valid JSON data found in the output.")

                json_data = json_match.group(0)
                data = json.loads(json_data)
            except json.JSONDecodeError as e:
                messagebox.showerror("错误", f"解析 JSON 数据失败: {e}")
                return
            except ValueError as e:
                messagebox.showerror("错误", f"提取 JSON 数据失败: {e}")
                return

            envs = data.get('envs', [])

            if not envs:
                messagebox.showinfo("信息", "未找到任何环境。")
                return

            for env in envs:
                env_name = os.path.basename(env)
                env_frame = tk.Frame(self.env_list_frame)
                env_frame.pack(pady=5, fill=tk.X)

                # 激活按钮放到左边
                activate_button = tk.Button(env_frame, text="激活", command=lambda e=env_name: self.activate_env(e))
                activate_button.pack(side=tk.LEFT, padx=5)

                # 环境名称标签
                env_label = tk.Label(env_frame, text=env_name, anchor="w", width=20)
                env_label.pack(side=tk.LEFT, padx=5)

                # 输入框居中并拉长
                package_entry = tk.Entry(env_frame, width=30)
                package_entry.pack(side=tk.LEFT, padx=5, expand=True, fill=tk.X)

                # 安装按钮放到右边
                install_button = tk.Button(env_frame, text="安装", command=lambda e=env_name, p=package_entry: self.start_installation(e, p.get()))
                install_button.pack(side=tk.RIGHT, padx=5)

        except Exception as e:
            messagebox.showerror("错误", f"获取环境失败: {e}")

    def start_installation(self, env_name, package_name):
        if not package_name:
            messagebox.showwarning("警告", "请输入包名。")
            return

        self.log_output.delete(1.0, tk.END)
        threading.Thread(target=self.install_package, args=(env_name, package_name)).start()

    def install_package(self, env_name, package_name):
        try:
            process = subprocess.Popen(
                [self.conda_path, 'install', package_name, '-n', env_name, '-y'],
                stdout=subprocess.PIPE,
                stderr=subprocess.STDOUT,
                text=True
            )

            for line in process.stdout:
                self.log_output.insert(tk.END, line)
                self.log_output.see(tk.END)

            process.wait()
            messagebox.showinfo("成功", f"在 {env_name} 中安装了 {package_name}。")
        except subprocess.CalledProcessError as e:
            messagebox.showerror("错误", f"安装包失败: {e}")

    def activate_env(self, env_name):
        subprocess.run([self.conda_path, 'activate', env_name], check=True)
        messagebox.showinfo("激活", f"激活环境: {env_name}")

    def create_env(self):
        env_name = self.new_env_name.get().strip()
        python_version = self.python_version_entry.get().strip()  # 获取输入的 Python 版本

        if not env_name:
            messagebox.showwarning("警告", "请输入新环境的名称。")
            return

        if not python_version:
            messagebox.showwarning("警告", "请输入 Python 版本。")
            return

        try:
            subprocess.run([self.conda_path, 'create', '--name', env_name, f'python={python_version}', '-y'], check=True)
            messagebox.showinfo("成功", f"创建新环境: {env_name},Python 版本: {python_version}。")
            self.new_env_name.delete(0, tk.END)
            self.python_version_entry.delete(0, tk.END)  # 清空 Python 版本输入框
            self.refresh_envs()
        except subprocess.CalledProcessError as e:
            messagebox.showerror("错误", f"创建环境失败: {e}")

if __name__ == "__main__":
    root = tk.Tk()
    app = CondaEnvManager(root)
    root.mainloop()

最后通过执行:pyinstaller --onefile --windowed Conda.py,打包成可执行的exe文件即可

启动的时候需要输入conda所在目录(本来我是想通过环境变量来设置,但是代码里面读取不到,于是就采取这种本方法了),比如我的conda安装在:

那么启动时输入: D:/install/anaconda3/condabin/conda.bat

PS:需要先安装  pyinstaller和anaconda(或者miniconda),pyinstaller可以用pip安装(pip install pyinstaller),conda的安装就不在这里说了,跟普通的软件安装一样,一直下一步即可

然后就是如何使用已经创建好的环境了,此处以pycharm为例,比如我创建了一个ai312的环境,那么在conda的安装目录的envs目录下面就会生成一个ai312的目录:

在pycharm里面选择这个python.exe文件:


http://www.niftyadmin.cn/n/5865792.html

相关文章

C++ 继承与运算符重载的简单练习

1.长方形的继承类 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std; class AB{ private:int a;int …

【odoo18-文件管理】在uniapp上访问odoo系统上的图片

在uniapp上访问odoo系统上的图片 1、以url的形式访问 a&#xff1a;以odoo本身的域名&#xff0c;比如http://127.0.0.1:8069/web/image/product.template/3/image_128?unique1740380422000&#xff0c;这种方式需要解决跨域的问题。 b&#xff1a;以文件服务器的形式&…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…

蓝桥杯备赛-迷宫-BFS

这是一个关于二维迷宫的题目。我们要从迷宫的起点 S 走到终点 E&#xff0c;每一步我们只能选择上下左右四个方向中的一个前进一格。 W 代表墙壁&#xff0c;是不能进入的位置&#xff0c;除了墙壁以外的地方都可以走。迷宫内的 D 代表一道上锁的门&#xff0c;只有在持有钥匙的…

iOS开发 网络安全

iOS开发中的网络安全 在当前的数字化时代&#xff0c;任何应用程序都需要重视网络安全。尤其是对于iOS应用开发者而言&#xff0c;确保应用与服务器之间的数据传输安全是至关重要的。接下来&#xff0c;我们将学习“iOS开发 网络安全”的实现过程。 流程步骤 以下是实现iOS网…

WPS接入私有化DeepSeek大语言模型

文章目录 1.安装officeAI软件1.1登录官网下载officeAI 2.officeAI相关配置2.1启动WPS第三方COM功能2.2接入本地ollama服务2.3演示示例 1.安装officeAI软件 OfficeAI 助手是一项专为 Microsoft Office 和 WPS 用户打造的智能办公工具软件&#xff0c;旨在解决多种常见办公问题。…

堆排序(详解)c++

堆排序 &#xff08;可以⽤ ppt 演⽰流程&#xff09; 堆排序(Heap Sort)是指利⽤堆这种数据结构所设计的⼀种排序算法。本质上是优化了选择排序算法&#xff0c;选择排序的思想是在堆排序元素中拿出最大值或最小值&#xff0c;然后把这个位置的值放在它该放的位置上就可以了&a…

为什么要将PDF转换为CSV?CSV是Excel吗?

在企业和数据管理的日常工作中&#xff0c;PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档&#xff0c;而CSV因其简洁、易操作的特性&#xff0c;广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据&#xff0c;转换为CSV格式可能是一个高效…