首页 新闻 会员 周边 捐助

使用python 从码云仓库中下载.exe遇到问题

0
悬赏园豆:80 [待解决问题]

从gitee上下载 仓库中的.exe文件,写了以下一段代码:
def download(appurl, save_path):#下载文件,可以使用相对路径
"""下载单个文件"""
try:
response = requests.get(appurl, stream=True, timeout=300,headers=headers)
response.raise_for_status()
os.makedirs(os.path.dirname(save_path), exist_ok=True)
with open(save_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print(f"文件下载成功: {save_path}")
return True
except Exception as e:
print(f"下载失败: {str(e)}")
return False

文件下载地址: https://gitee.com/name/netapp/raw/master/dccauto.exe

所发生的问题如下:
一个非常简单的print("hello world"), 打包成的.exe 可以正常下载。
但,下面的代码用pyinstaller 打包成的.exe, 却总是下载失败。
当手动通过gitee 时,可以正常下载。
请大佬们帮忙看看问题出在哪了, 我打包的文件的 原始代码如下:
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import os
import sys
import shutil
import re
from datetime import datetime

class FileManagerApp:
def init(self, root):
self.root = root
self.root.title("文件管理工具")
self.root.geometry("700x600")

    # 设置中文字体
    self.default_font = ('SimHei', 10) if sys.platform.startswith('win') else ('WenQuanYi Micro Hei', 10)
    
    # 存储当前选择的文件路径
    self.selected_file = ""
    self.similar_files = []
    self.selected_similar_file = ""
    
    # 配置文件路径
    self.config_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "cona.txt")
    
    # 初始化路径
    self.source_folder, self.dest_folder = self.load_config_paths()
    
    self.create_widgets()
    
def load_config_paths(self):
    """从con.txt加载源文件夹和目标文件夹路径"""
    source = "D:\\tem\\"
    dest = "D:\\"
    
    try:
        if os.path.exists(self.config_file):
            with open(self.config_file, 'r', encoding='utf-8') as f:
                lines = f.readlines()
                
                # 第一行:初始选择路径
                # 第二行:源文件夹
                # 第三行:目标文件夹
                if len(lines) > 1:
                    source = lines[1].strip() or source
                if len(lines) > 2:
                    dest = lines[2].strip() or dest
    except Exception as e:
        messagebox.showerror("配置文件错误", f"读取配置文件时出错:\n{str(e)}")
        
    return source, dest

def save_config_paths(self):
    """保存源文件夹和目标文件夹路径到con.txt"""
    try:
        # 读取现有配置
        lines = []
        if os.path.exists(self.config_file):
            with open(self.config_file, 'r', encoding='utf-8') as f:
                lines = f.readlines()
        
        # 更新配置
        initial_dir = lines[0].strip() if lines else ""
        
        with open(self.config_file, 'w', encoding='utf-8') as f:
            f.write(f"{initial_dir}\n")  # 第一行:初始选择路径
            f.write(f"{self.source_folder}\n")  # 第二行:源文件夹
            f.write(f"{self.dest_folder}\n")  # 第三行:目标文件夹
            
    except Exception as e:
        messagebox.showerror("配置文件错误", f"保存配置文件时出错:\n{str(e)}")

def create_widgets(self):
    # 创建顶部框架
    top_frame = ttk.Frame(self.root)
    top_frame.pack(fill="x", padx=10, pady=10)
    
    # 创建中间框架 (用于文件路径和相似文件)
    middle_frame = ttk.Frame(self.root)
    middle_frame.pack(fill="both", expand=True, padx=10, pady=5)
    
    # 创建底部框架 (用于按钮)
    bottom_frame = ttk.Frame(self.root)
    bottom_frame.pack(fill="x", padx=10, pady=10)
    
    # 顶部标签 - 源文件夹
    ttk.Label(top_frame, text="生效文件夹:", font=self.default_font).grid(row=0, column=0, padx=5, sticky="w")
    self.label2_var = tk.StringVar(value=self.source_folder)
    self.label2 = ttk.Label(top_frame, textvariable=self.label2_var, font=self.default_font, foreground="blue", cursor="hand2")
    self.label2.grid(row=0, column=1, padx=5, sticky="w")
    self.label2.bind("<Button-1>", lambda e: self.browse_source_folder())
    
  #  ttk.Button(top_frame, text="更改", command=self.browse_source_folder).grid(row=0, column=2, padx=5)
    
    # 顶部标签 - 目标文件夹
    ttk.Label(top_frame, text="作废文件夹:", font=self.default_font).grid(row=1, column=0, padx=5, sticky="w")
    self.label4_var = tk.StringVar(value=self.dest_folder)
    self.label4 = ttk.Label(top_frame, textvariable=self.label4_var, font=self.default_font, foreground="blue", cursor="hand2")
    self.label4.grid(row=1, column=1, padx=5, sticky="w")
    self.label4.bind("<Button-1>", lambda e: self.browse_dest_folder())
    
   # ttk.Button(top_frame, text="更改", command=self.browse_dest_folder).grid(row=1, column=2, padx=5)
    
    # 选择文件区域
    ttk.Label(middle_frame, text="选择文件:", font=self.default_font).pack(anchor="w", padx=5, pady=5)
    
    self.path_frame = ttk.Frame(middle_frame, relief="solid", borderwidth=1)
    self.path_frame.pack(fill="x", padx=5, pady=5)
    
    self.label5_var = tk.StringVar(value="点击此处选择文件")
    self.label5 = ttk.Label(
        self.path_frame, 
        textvariable=self.label5_var, 
        font=('SimHei', 10),
        foreground="blue",
        cursor="hand2",
        justify="left",
        wraplength=600
    )
    self.label5.pack(ipadx=5, ipady=5, fill="x")
    self.label5.bind("<Button-1>", lambda e: self.select_file())
    
    # 相似文件列表区域
    ttk.Label(middle_frame, text="相似文件列表:", font=self.default_font).pack(anchor="w", padx=5, pady=5)
    
    self.similar_files_frame = ttk.Frame(middle_frame, relief="solid", borderwidth=1)
    self.similar_files_frame.pack(fill="both", expand=True, padx=5, pady=5)
    
    # 创建一个Canvas用于滚动
    self.canvas = tk.Canvas(self.similar_files_frame)
    self.scrollbar = ttk.Scrollbar(self.similar_files_frame, orient="vertical", command=self.canvas.yview)
    self.scrollable_frame = ttk.Frame(self.canvas)
    
    self.scrollable_frame.bind(
        "<Configure>",
        lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all"))
    )
    
    self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
    self.canvas.configure(yscrollcommand=self.scrollbar.set)
    
    self.scrollbar.pack(side="right", fill="y")
    self.canvas.pack(side="left", fill="both", expand=True)
    
    # 按钮区域
    self.button1 = ttk.Button(bottom_frame, text="执行文件替换", command=self.execute_file_operations)
    self.button1.pack(side="left", padx=10, pady=5, fill="x", expand=True)
    
    self.button2 = ttk.Button(bottom_frame, text="清除选择", command=self.clear_selection)
    self.button2.pack(side="left", padx=10, pady=5, fill="x", expand=True)

def browse_source_folder(self):
    folder = filedialog.askdirectory(title="选择源文件夹")
    if folder:
        self.source_folder = folder + os.sep
        self.label2_var.set(self.source_folder)
        self.save_config_paths()

def browse_dest_folder(self):
    folder = filedialog.askdirectory(title="选择目标文件夹")
    if folder:
        self.dest_folder = folder + os.sep
        self.label4_var.set(self.dest_folder)
        self.save_config_paths()

def select_file(self):
    """打开文件选择对话框并处理选择的文件"""
    initial_dir = ""
    
    try:
        if os.path.exists(self.config_file):
            with open(self.config_file, 'r', encoding='utf-8') as f:
                initial_dir = f.readline().strip()
        
        if initial_dir and not os.path.exists(initial_dir):
            initial_dir = ""
            
    except Exception:
        initial_dir = ""
    
    # 打开文件选择对话框
    file_path = filedialog.askopenfilename(
        title="选择文件",
        initialdir=initial_dir if initial_dir else os.getcwd()
    )
    
    # 如果用户选择了文件
    if file_path:
        self.selected_file = file_path
        self.label5_var.set(file_path)
        
        # 更新配置文件中的初始目录
        try:
            dir_path = os.path.dirname(file_path)
            
            # 读取现有配置
            lines = []
            if os.path.exists(self.config_file):
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    lines = f.readlines()
            
            # 更新第一行
            with open(self.config_file, 'w', encoding='utf-8') as f:
                f.write(f"{dir_path}\n")
                
                # 写入其余行(如果存在)
                if len(lines) > 1:
                    for line in lines[1:]:
                        f.write(line)
                        
        except Exception:
            pass  # 忽略保存错误
        
        # 搜索相似文件
        self.search_similar_files()

def search_similar_files(self):
    """在指定文件夹中搜索与所选文件相似的文件"""
    if not self.selected_file:
        return
        
    # 清除之前的相似文件列表
    for widget in self.scrollable_frame.winfo_children():
        widget.destroy()
    
    # 获取源文件夹路径
    source_folder = self.source_folder
    if not source_folder or not os.path.exists(source_folder):
        messagebox.showerror("错误", "源文件夹路径无效")
        return
        
    # 获取所选文件的文件名(不包含路径)
    selected_filename = os.path.basename(self.selected_file)
    
    # 提取文件名的主要部分(不包含扩展名)
    filename_part = os.path.splitext(selected_filename)[0].lower()
    
    # 在源文件夹及其子文件夹中搜索相似文件
    self.similar_files = []
    
    for root, _, files in os.walk(source_folder):
        for file in files:
            # 简单的相似度匹配 - 可以根据需要调整
            if filename_part in file.lower() or file.lower() in filename_part:
                file_path = os.path.join(root, file)
                self.similar_files.append(file_path)
    
    # 显示相似文件
    if not self.similar_files:
        ttk.Label(self.scrollable_frame, text="未找到相似文件", font=self.default_font).pack(anchor="w", padx=5, pady=5)
    else:
        for i, file_path in enumerate(self.similar_files):
            # 创建一个可点击的标签
            label = ttk.Label(
                self.scrollable_frame, 
                text=file_path, 
                font=self.default_font,
                foreground="blue",
                cursor="hand2",
                justify="left",
                wraplength=580
            )
            label.pack(anchor="w", padx=5, pady=2)
            
            # 绑定点击事件
            label.bind("<Button-1>", lambda e, idx=i: self.select_similar_file(idx))

def select_similar_file(self, index):
    """选择相似文件列表中的一个文件"""
    # 清除之前的选择
    for widget in self.scrollable_frame.winfo_children():
        if isinstance(widget, ttk.Label):
            widget.configure(background="")
    
    # 设置当前选择
    self.selected_similar_file = self.similar_files[index]
    
    # 高亮显示选中的文件
    self.scrollable_frame.winfo_children()[index].configure(background="#e0e0e0")

def execute_file_operations(self):
    """执行文件剪切和复制操作"""
    if not self.selected_file:
        messagebox.showwarning("警告", "请先选择一个文件")
        return
        
    if not self.selected_similar_file:
        messagebox.showwarning("警告", "请从相似文件列表中选择一个文件")
        return
        
    # 获取目标文件夹
    dest_folder = self.dest_folder
    if not dest_folder or not os.path.exists(dest_folder):
        messagebox.showerror("错误", "目标文件夹路径无效")
        return
        
    # 获取当前日期 (格式: yyyy-mm-dd)
    today = datetime.now().strftime("%Y-%m-%d")
    
    # 构建带日期后缀的文件名
    source_file = self.selected_similar_file
    source_filename, source_ext = os.path.splitext(os.path.basename(source_file))
    dest_filename = f"{source_filename}_{today}{source_ext}"
    dest_file = os.path.join(dest_folder, dest_filename)
    
    # 确认操作
    message = (f"确定要执行以下操作吗?\n\n"
              f"1. 将以下文件剪切到目标文件夹并添加日期后缀:\n   {source_file}\n   → {dest_file}\n\n"
              f"2. 将以下文件复制到原文件位置:\n   {self.selected_file}")
    
    if messagebox.askyesno("确认操作", message):
        try:
            # 确保目标文件夹存在
            os.makedirs(os.path.dirname(dest_file), exist_ok=True)
            
            # 执行剪切操作(添加日期后缀)
            shutil.move(source_file, dest_file)
            
            # 执行复制操作
            shutil.copy2(self.selected_file, os.path.dirname(source_file))
            
            messagebox.showinfo("成功", "文件操作已完成!")
            
            # 更新相似文件列表
            self.search_similar_files()
            
        except Exception as e:
            messagebox.showerror("操作失败", f"执行文件操作时出错:\n{str(e)}")

def clear_selection(self):
    """清除所有选择"""
    self.selected_file = ""
    self.selected_similar_file = ""
    self.label5_var.set("点击此处选择文件")
    
    # 清除相似文件列表
    for widget in self.scrollable_frame.winfo_children():
        widget.destroy()
    
    ttk.Label(self.scrollable_frame, text="未选择文件", font=self.default_font).pack(anchor="w", padx=5, pady=5)

if name == "main":
root = tk.Tk()
app = FileManagerApp(root)
root.mainloop()

小白沙的主页 小白沙 | 初学一级 | 园豆:27
提问于:2025-07-20 10:23
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册