Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pyinstaller生成的可执行文件中使用pyunpack,并与try except结合使用_Python_Python 3.x_Try Catch_Pyinstaller_Unzip - Fatal编程技术网

Python 在pyinstaller生成的可执行文件中使用pyunpack,并与try except结合使用

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

我对pyunpack有一种奇怪的行为,pyunpack是一个用于解包的包,在一个可执行文件中

我想做以下事情:

我有一个.7z类型的文件,它的结尾不是.7z,而是.sent

首先,我尝试直接解压它,这会导致捕获到预期的错误

在这个错误捕获中,我首先添加.7z扩展名,然后解压 将文件正确地放入名为“grog”的文件夹中,然后我将压缩后的文件的原始名称返回

代码如下:

# 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。