我使用 python 制作了一个粗略的自动更新应用程序,并使用 freeze-cx 制作了 exe 文件。
首先,该应用程序检查 firebase 服务器上是否有最新版本的文件可用,如果可用则下载 zip 文件。并且应用程序解压并覆盖文件。
this_file_path = sys.executable if getattr(sys, 'frozen', False) else __file__
path_here = str(Path(this_file_path).parent.absolute())
storagePath = '/version/File'+ver_recent+'.zip'
storage.child(storagePath).download(path='', filename=path_here+'/File.zip')
file_name = path_here+'/File.zip'
output_dir = path_here+"\\"
format = "zip"
messagebox.showinfo('Update Ongoing', 'Downloading newest version is done. Extracting file to:'+output_dir)
shutil.unpack_archive(file_name, output_dir, format)
这里,我的意图是我的应用程序覆盖文件夹中的所有组件。
我确认,如果我告诉我的应用程序覆盖其他文件夹中的文件,并且我看到其他人们说这种机制是可能的。
但是,在运行程序时,它会吐出错误消息:
open(targetpath, 'wb') as target:
PermissionError: [Errno13] Permission denied: C\\Users\\bboyc\\Documents\\File_0142\\lib\\_asyncio.pyd
因为我对python还是新手,我无法猜测具体原因。我只是无法理解为什么该文件拒绝被访问。
任何人都可以告诉我发生了什么或者我失踪了吗?当未运行的文件发生这种情况时,我成功覆盖了,所以我认为这不是 _asyncio.pyd 文件的问题。
遇到的错误消息“PermissionError: [Errno 13] Permission denied”表示运行 Python 应用程序的用户没有必要的权限来修改“C:\Users\bboyc\Documents\File_0142\lib_asyncio.pyd”文件。
以下是此错误发生的几个可能原因:
-
文件正在被使用: 最可能的原因是另一个程序正在使用
_asyncio.pyd
文件,从而阻止了的应用程序覆盖它。这可能是 Python 解释器本身,也可能是另一个使用 asyncio 库的程序。 -
权限不足: 的应用程序可能没有足够的权限来修改
C:\Users\bboyc\Documents\File_0142\lib
文件夹或其内容。这在没有管理员权限的情况下运行应用程序时可能会发生。 -
防病毒软件干扰: 的防病毒软件可能会将的应用程序的行为解释为恶意行为,并阻止它修改文件。
以下是一些可以尝试的解决方案:
1. 确认没有其他程序正在使用该文件:
- 关闭可能使用 asyncio 库的任何其他 Python 程序。
- 尝试重新启动的计算机以确保没有程序在后台运行并锁定该文件。
2. 以管理员权限运行的应用程序:
- 右键单击的应用程序的可执行文件,然后选择“以管理员身份运行”。这将授予的应用程序修改系统文件的必要权限。
3. 将的应用程序安装到具有写入权限的不同目录:
-
避免将的应用程序安装到需要管理员权限才能修改的系统目录中,例如
C:\Program Files
。 -
而是尝试将的应用程序安装到用户目录(例如
C:\Users\bboyc\My Applications
)或具有适当权限的其他位置。
4. 创建一个临时文件夹并将更新后的文件解压缩到该文件夹,然后替换原始文件:
- 这有助于避免在提取过程中出现文件锁定问题。
-
可以使用
shutil.move()
函数替换原始文件。
5. 在防病毒软件中将的应用程序添加为例外:
- 如果怀疑的防病毒软件是罪魁祸首,请尝试在其中添加一个例外以允许的应用程序修改文件。
示例代码(结合了解决方案 4):
import os
import shutil
import tempfile
# ...的现有代码...
# 创建一个临时文件夹
with tempfile.TemporaryDirectory() as temp_dir:
# 将更新后的文件解压缩到临时文件夹
shutil.unpack_archive(file_name, temp_dir, format)
# 遍历临时文件夹中的文件
for subdir, _, files in os.walk(temp_dir):
for file in files:
source_file = os.path.join(subdir, file)
target_file = os.path.join(output_dir, os.path.relpath(source_file, temp_dir))
# 替换原始文件
shutil.move(source_file, target_file)
重要说明: 允许应用程序覆盖自身存在安全风险。请确保从受信任的来源下载更新,并验证更新文件的完整性,以最大程度地降低安全风险。
标签:python,shutil From: 78753343