从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
所发生的问题如下:
一个非常简单的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()