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

最近在学习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 threadingclass CondaEnvManager:def __init__(self, root):self.root = rootself.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_pathelse: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}")returnexcept ValueError as e:messagebox.showerror("错误", f"提取 JSON 数据失败: {e}")returnenvs = data.get('envs', [])if not envs:messagebox.showinfo("信息", "未找到任何环境。")returnfor 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("警告", "请输入包名。")returnself.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("警告", "请输入新环境的名称。")returnif not python_version:messagebox.showwarning("警告", "请输入 Python 版本。")returntry: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.mzph.cn/diannao/70738.shtml

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

相关文章

【复习】计算机网络

网络模型 OSI 应用层:给应用程序提供统一的接口表示层:把数据转换成兼容另一个系统能识别的格式会话层:负责建立、管理、终止表示层实体之间的通信会话传输层:负责端到端的数据传输网络层:负责数据的路由、转发、分片…

图书馆系统源码详解

本项目是一个基于Scala语言开发的图书馆管理系统。系统主要由以下几个部分组成:数据访问层(DAO)、数据模型层(Models)、服务层(Service)以及用户界面层(UI)。以下是对项目…

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器(Bloom Filter) BitMap介绍 Redis中的使用 Redis功能示例 添加: 获取: 批量获取: java中实现 统计本月连续签到次数 UV统计 UV 统计…

【数据库】【MySQL】索引

MySQL中索引的概念 索引(MySQL中也叫做"键(key)")是一种数据结构,用于存储引擎快速定找到记录。 简单来说,它类似于书籍的目录,通过索引可以快速找到对应的数据行,而无需…

【SpringBoot AI 集成DeepSeek 大模型API调用】

当DeepSeek开始盛行,提供强大的大语言模型,界面调用不能满足我们的需要,同时提供API接口供我们在服务中调用,来实现各种AI场景。 我们通过将DeepSeek的AI能力与SpringBoot AI相结合,实现智能聊天、问答机器人&#xf…

Linux 性能更好的ftp客户端 lftp 使用详解

简介 LFTP 是一个命令行 FTP 客户端,支持多种文件传输协议,包括 FTP、FTPS、HTTP、HTTPS和SFTP 。它以其通过镜像、后台操作和脚本支持等特性有效管理复杂传输的能力而闻名。 安装 Ubuntu/Debian sudo apt update sudo apt install lftpCentOS/RHEL/…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分: 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑: 2022年6月6日:项目启动会2022年12月1日:系统上线 二、总体目标 通过SAP实施,构建研产供销协同、业财一…

【深度学习】矩阵的理解与应用

一、矩阵基础知识 1. 什么是矩阵? 矩阵是一个数学概念,通常表示为一个二维数组,它由行和列组成,用于存储数值数据。矩阵是线性代数的基本工具之一,广泛应用于数学、物理学、工程学、计算机科学、机器学习和数据分析等…

<网络> UDP协议

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat与iostat pidof UDP协议 UDP协议格式 UDP数据封装: UDP数据分用: UDP协议的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协 传输层 在学习HTTP等应用层协议时&…

大模型面试基础问题

1.1.1 最主流的开源模型? ChatGLM-6B[1] prefix LM LLaMA-7B[2] causal LM 1.1.2 prefix LM和causal LM的区别? 1.1.2.1 Prefix LM Prefix LM,即前缀语言模型,该结构是Google的T5模型论文起的名字,望文知义来说&…

your HTTP request connection start duration too long

If your HTTP request connection start duration is taking more than 7 seconds, here are some possible causes and troubleshooting steps: Possible Causes: Network Latency – Slow internet or network congestion.DNS Resolution Delay – Slow DNS lookup affecti…

Python天梯赛系统备考-字符串篇

知识点拆解 1. 切片技巧 定义 通过 [start:end:step] 语法截取字符串的子序列 start:起始索引(包含,默认0) end:结束索引(不包含,默认末尾) step:步长&#xff0…

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是国内视频行业最重要的国家标准,目前有三个版本: 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平…

深入探究 C 语言内存函数:memcpy、memmove、memset 和 memcmp

一,常见的内存函数 在 C 语言的编程世界里,对内存的高效操作至关重要。C 标准库为我们提供了一系列强大的内存操作函数,其中 memcpy、memmove、memset 和 memcmp 这四个函数是处理内存数据的得力助手。接下来,让我们深入了解它们…

Java 集合

Java 集合 在 Java 编程中,集合框架(java.util 包)是处理一组对象的强大工具。与数组不同,集合提供了更灵活的数据存储和操作方式。本文将详细介绍 Java 集合框架的核心接口、常用实现类及其应用场景,帮助你更好地理解…

go基本语法

跟Java比较学习。 hello word 示例代码 test1.go文件: // 包路径 package main// 导入模块,下面两种都行 import ("fmt" ) import "log"// main方法 func main() {log.Print("hello word !!!")fmt.Print("hello …

【Docker】如何在Linux、Windows、MacOS中安装Docker

Linux安装Docker 在终端中执行一键安装脚本命令安装docker sudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker镜像源 在终端执行 一行命令,编辑配置文件 sudo …

2.24力扣-回溯电话号码的字母组合

17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<String> ans new LinkedList<>();StringBuilder temp new StringBuilder();public List<String> letterCombinations(String digits) {if(digitsnull || digits.leng…

Cocos Creator Shader入门实战(一):材质和Effect的了解

引擎版本&#xff1a;3.8.5 环境&#xff1a; Windows 简介 在Cocos Creator中&#xff0c;游戏炫彩缤纷的效果是借助着色器(Shader)来实现的。 Cocos主要基于OpenGL ES&#xff0c;而Shader的编写则是在可编程渲染管线中基于修改&#xff1a;顶点着色器(Vertex) 和 片段着色…

akka现有的分布式定时任务框架总结

根据你的需求&#xff0c;以下是一些基于 Akka 实现的分布式定时任务框架&#xff0c;以及相关的 GitHub 项目推荐&#xff1a; 1. Openjob Openjob 是一个基于 Akka 架构的新一代分布式任务调度框架&#xff0c;支持多种定时任务、延时任务、工作流设计&#xff0c;采用无中…