Python 在pyinstaller生成的可执行文件中使用pyunpack,并与try except结合使用
我对pyunpack有一种奇怪的行为,pyunpack是一个用于解包的包,在一个可执行文件中 我想做以下事情: 我有一个.7z类型的文件,它的结尾不是.7z,而是.sent 首先,我尝试直接解压它,这会导致捕获到预期的错误 在这个错误捕获中,我首先添加.7z扩展名,然后解压 将文件正确地放入名为“grog”的文件夹中,然后我将压缩后的文件的原始名称返回 代码如下:Python 在pyinstaller生成的可执行文件中使用pyunpack,并与try except结合使用,python,python-3.x,try-catch,pyinstaller,unzip,Python,Python 3.x,Try Catch,Pyinstaller,Unzip,我对pyunpack有一种奇怪的行为,pyunpack是一个用于解包的包,在一个可执行文件中 我想做以下事情: 我有一个.7z类型的文件,它的结尾不是.7z,而是.sent 首先,我尝试直接解压它,这会导致捕获到预期的错误 在这个错误捕获中,我首先添加.7z扩展名,然后解压 将文件正确地放入名为“grog”的文件夹中,然后我将压缩后的文件的原始名称返回 代码如下: # test.py from os.path import abspath, join, exists, dirname from
# test.py
from os.path import abspath, join, exists, dirname
from os import rename, mkdir
from shutil import copy
import multiprocessing
import pyunpack
multiprocessing.freeze_support()
print(0)
name = "file_to_be_unzipped.sent"
print("a")
path = "C:\\Users\\myname\\eclipse-workspace-tms\\test_unzip_exe"
print(abspath("."))
print("b")
unzip_dest = join(path, "grog")
if not exists(unzip_dest):
mkdir(unzip_dest)
print("c")
name = join(path, name)
print("d")
print("e")
try:
print(1)
pyunpack.Archive(name).extractall(unzip_dest)
print(2)
except pyunpack.PatoolError as pterr:
print(3)
temp_f_name = name + ".7z"
print(4)
rename(name, temp_f_name)
try:
print(5)
pyunpack.Archive(temp_f_name).extractall(unzip_dest)
print(6)
rename(temp_f_name, name)
print(7)
except pyunpack.PatoolError as pterr2:
# removing useless 7z extension
print(8)
rename(temp_f_name, name)
print(9)
# Case when the file is already unzipped
if str(pterr2).find("Is not archive"):
print(10)
copy(name, unzip_dest)
print(11)
print(12)
except ValueError as v:
print(13)
print(v)
print(14)
当我启动脚本test.py时,我得到了预期的行为:
0
a
C:\Users\myname\eclipse-workspace-tms\test_unzip_exe
b
c
d
e
1
3
4
5
6
7
然后,我使用以下命令行构建可执行文件:
pyinstaller --log-level=DEBUG test.spec
以及以下规范文件:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
import pyunpack
import patoolib
from pyunpack import Archive, PatoolError
from patoolib.programs import ar
from patoolib.programs import arc
from patoolib.programs import archmage
from patoolib.programs import arj
from patoolib.programs import bsdcpio
from patoolib.programs import bsdtar
from patoolib.programs import bzip2
from patoolib.programs import cabextract
from patoolib.programs import chmlib
from patoolib.programs import clzip
from patoolib.programs import compress
from patoolib.programs import cpio
from patoolib.programs import dpkg
from patoolib.programs import flac
from patoolib.programs import genisoimage
from patoolib.programs import gzip
from patoolib.programs import isoinfo
from patoolib.programs import lbzip2
from patoolib.programs import lcab
from patoolib.programs import lha
from patoolib.programs import lhasa
from patoolib.programs import lrzip
from patoolib.programs import lzip
from patoolib.programs import lzma
from patoolib.programs import lzop
from patoolib.programs import mac
from patoolib.programs import nomarch
from patoolib.programs import p7azip
from patoolib.programs import p7rzip
from patoolib.programs import p7zip
from patoolib.programs import pbzip2
from patoolib.programs import pdlzip
from patoolib.programs import pigz
from patoolib.programs import plzip
from patoolib.programs import py_bz2
from patoolib.programs import py_echo
from patoolib.programs import py_gzip
from patoolib.programs import py_lzma
from patoolib.programs import py_tarfile
from patoolib.programs import py_zipfile
from patoolib.programs import rar
from patoolib.programs import rpm
from patoolib.programs import rpm2cpio
from patoolib.programs import rzip
from patoolib.programs import shar
from patoolib.programs import shorten
from patoolib.programs import star
from patoolib.programs import tar
from patoolib.programs import unace
from patoolib.programs import unadf
from patoolib.programs import unalz
from patoolib.programs import uncompress
from patoolib.programs import unrar
from patoolib.programs import unshar
from patoolib.programs import unzip
from patoolib.programs import xdms
from patoolib.programs import xz
from patoolib.programs import zip
from patoolib.programs import zoo
from patoolib.programs import zopfli
from patoolib.programs import zpaq
# from pyunpack import Archive, PatoolError
a = Analysis(['test.py'],
pathex=['C:\\Users\\myname\\eclipse-workspace-tms\\test_unzip_exe'],
binaries=[],
datas=[],
hiddenimports=['pyunpack', 'patoolib',
'patoolib.programs.ar',
'patoolib.programs.arc',
'patoolib.programs.archmage',
'patoolib.programs.arj',
'patoolib.programs.bsdcpio',
'patoolib.programs.bsdtar',
'patoolib.programs.bzip2',
'patoolib.programs.cabextract',
'patoolib.programs.chmlib',
'patoolib.programs.clzip',
'patoolib.programs.compress',
'patoolib.programs.cpio',
'patoolib.programs.dpkg',
'patoolib.programs.flac',
'patoolib.programs.genisoimage',
'patoolib.programs.gzip',
'patoolib.programs.isoinfo',
'patoolib.programs.lbzip2',
'patoolib.programs.lcab',
'patoolib.programs.lha',
'patoolib.programs.lhasa',
'patoolib.programs.lrzip',
'patoolib.programs.lzip',
'patoolib.programs.lzma',
'patoolib.programs.lzop',
'patoolib.programs.mac',
'patoolib.programs.nomarch',
'patoolib.programs.p7azip',
'patoolib.programs.p7rzip',
'patoolib.programs.p7zip',
'patoolib.programs.pbzip2',
'patoolib.programs.pdlzip',
'patoolib.programs.pigz',
'patoolib.programs.plzip',
'patoolib.programs.py_bz2',
'patoolib.programs.py_echo',
'patoolib.programs.py_gzip',
'patoolib.programs.py_lzma',
'patoolib.programs.py_tarfile',
'patoolib.programs.py_zipfile',
'patoolib.programs.rar',
'patoolib.programs.rpm',
'patoolib.programs.rpm2cpio',
'patoolib.programs.rzip',
'patoolib.programs.shar',
'patoolib.programs.shorten',
'patoolib.programs.star',
'patoolib.programs.tar',
'patoolib.programs.unace',
'patoolib.programs.unadf',
'patoolib.programs.unalz',
'patoolib.programs.uncompress',
'patoolib.programs.unrar',
'patoolib.programs.unshar',
'patoolib.programs.unzip',
'patoolib.programs.xdms',
'patoolib.programs.xz',
'patoolib.programs.zip',
'patoolib.programs.zoo',
'patoolib.programs.zopfli',
'patoolib.programs.zpaq'],
# hiddenimports=['Archive', 'PatoolError'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='test',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='test')
经过一段意想不到的长时间之后,我得到了以下结果:
0
a
C:\Users\myname\eclipse-workspace-tms\test_unzip_exe\dist\test
b
c
d
e
1
2
其中目标(“grog”)中的文件不是所需的解压缩文件,而只是一个副本
有人知道出了什么问题吗
非常感谢
编辑:
我取得了一些进展:
在脚本中,在打印(1)之后,如果我添加:
sys.executable=“C:\\Users\\myname\\AppData\\Local\\Continuum\\anaconda3\\python.exe”
然后它又起作用了。但是我有一个不可移植的.exe
由于仅通过spec文件导入python.exe文件是不够的,
另一个解决方案是添加到spec文件中
(“C:\\Users\\myname\\AppData\\Local\\Continuum\\anaconda3\*,”)
它将生成一个巨大的可执行文件,或者通过反复试验一个接一个地选择所需的文件,这需要很多时间。欢迎任何优雅的解决方案
编辑2:为了获得更多信息,pyunpack中出现错误的部分位于init文件中,该文件位于:
“C:\\Users\\myname\\AppData\\Local\\Continuum\\anaconda3\\Lib\\site packages\\pyunpack\\\ uu init\uuuuuuuuuuuuuuuuuu.py”
在函数extract_all_patool中:
`p = EasyProcess([
sys.executable,
patool_path,
'--non-interactive',
'extract',
self.filename,
'--outdir=' + directory
# '--verbose'
]).call(timeout=self.timeout) `
问题是sys.executable被设置为test.exe文件,而不是python.exe可执行文件本身
EDIT3:我找到了一个半便携的解决方案,并不理想,但我还没有找到更好的解决方案:
最终用户需要在默认路径中安装anaconda,然后pip install patool
和pip install pyunpack
,然后将exe文件复制到用户名文件夹中的任何位置
在我这边:
我正在从pathlib导入路径添加规范文件导入pathlib
,
在等级库文件的隐藏导入列表中,我添加了:
'pathlib','pathlib.Path',
然后在代码中,在打印(1)
之后添加:
abspath = abspath(".")
user_path = Path(abspath).parts
user_path = join(user_path[0], user_path[1], user_path[2], user_path[3] )
conda_path = join("AppData", "Local", "Continuum", "anaconda3", "python.exe")
sys.executable = join(user_path, conda_path)
直接在python中运行时,print(abspath(“.”)
的输出为:
C:\Users\myname\eclipse-workspace-tms\test_unzip_exe
使用pyinstaller运行时:
C:\Users\myname\eclipse-workspace-tms\test_unzip_exe\dist\test
因此,不会在dist\test
文件夹中提取存档
通过将
path
设置为返回abspath(“.”
的值,而不是将其硬编码为C:\Users\myname\eclipse workspace tms\test\u unzip\u exe来解决此问题。正如您在第二次编辑中发现的那样,pyunpack
需要在目标系统上安装patool
,这反过来,需要python
要解决此问题,您需要:
- 使用柏油球或拉链
shutil
支持这些
- 或者要求最终用户安装python
另一种说法是,要将pyunpack
与pyinstaller
一起使用,您需要在目标系统上使用python。@Alejandro FernandezA邻近的问题是:@Legoroj也许您可以在这方面提供帮助,我设置了一个赏金nb:在代码中添加import patoolib
并没有改变任何事情,我正在关闭您在GitHub上发布的问题;这个地方也是。给我一两天的时间来解决这个问题。谢谢你回答Oluwafemi,但是,在我看来,这并不能解决问题:我真的想解压缩到文件夹中:path=“C:\\Users\\myname\\eclipse workspace tms\\test\u unzip\u exe\\grog”
这个文件夹的存在是有保证的,例如,mkdir functionHey@legorooj:很抱歉回答得太晚,我在过去的12天里一直患有著名的新冠病毒。我希望更精确:如果我理解得很好,你的解决方案2似乎就是我在编辑3中建议的(请否认)。你能更精确地说明你的解决方案1吗?Thank和regardsI还尝试导入整个anaconda,以便腾出时间逐个选择anaconda文件;但它仍然不起作用:由于制作了一个uge笨重的可执行文件,它在脚本中产生了新的错误/patool@MattDnv据我们所知,至少你免疫了。。。是您想要的函数,或查看tarfile
和zipfile
模块-都是stdlib。是解决方案2==编辑3。