[PYTHON] À propos de AVERTISSEMENT lors de l'empaquetage avec pyinstaller en utilisant pyocr

introduction

Bonjour, ravi de vous rencontrer, bonne nuit. Je suis désolé.

Les informations disponibles dans cet article sont:

la reproduction

  1. Installez Tesseract-OCR séparément (Professeur! Je pense que c'est la cause numéro un!)

  2. Écrivez * .py avec le pyocr approprié

  3. pyinstaller hoge.py

  4. Lorsque vous démarrez foo.exe crache avec dist, le journal suivant est généré ...

Running from container, but no tessdata (C:\Users\{user}\AppData\Local\Temp\_MEI{tempnumber}\data) found !
Running from container, but no tessdata (C:\Users\{user}\AppData\Local\Temp\_MEI{tempnumber}\data) found !

Eh bien, même si cela se produit, il peut être exécuté si Tesseract-OCR est installé séparément sur le PC cible, donc il n'y a pas beaucoup de gens qui sont fondamentalement en difficulté ...

Cependant, comme il est sale, je vais l'effacer.

Cause

Un rapide coup d'œil sur pyocr révèle tesseract.py près de la ligne: 120.

Telle est la cause.

    if getattr(sys, 'frozen', False):  # pragma: no cover
        # Pyinstaller support
        path = os.environ["PATH"]
        if sys._MEIPASS in path:
            # already changed
            return

        tesspath = os.path.join(sys._MEIPASS, "tesseract")
        tessprefix = os.path.join(sys._MEIPASS, "data")
        logger.info("Running in packaged environment")

        if not os.path.exists(os.path.join(tessprefix, "tessdata")):
            logger.warning(
                "Running from container, but no tessdata ({}) found !".format(
                    tessprefix
                )
            )
        else:
            logger.info("TESSDATA_PREFIX set to [{}]".format(tessprefix))
            os.environ['TESSDATA_PREFIX'] = tessprefix
        if not os.path.exists(tesspath):
            logger.warning(
                "Running from container, but no tesseract ({}) found !".format(
                    tesspath
                )
            )
        else:
            logger.info("[{}] added to PATH".format(tesspath))
            os.environ['PATH'] = (
                tesspath + os.pathsep + os.environ['PATH']
            )

Il semble qu'ils font diverses choses, mais l'utilisateur ne le sait pas (pleurs)

Apparemment, ce serait bien si sys._MEIPASS avait tesseract et data.

Ensuite, vous pouvez ajouter tesseract et des données à sys._MEIPASS! Solution! Enthousiasme! Prêt à combattre!

Ajoutez ce qui suit à * .spec

          Tree('{Tesseract-Chemin OCR}',prefix='tesseract'),
          Tree('{Tesseract-Chemin OCR}',prefix='data'),

Courir!

Running from container, but no tessdata (C:\Users\{user}\AppData\Local\Temp\_MEI{tempnumber}\data) found !
Running from container, but no tessdata (C:\Users\{user}\AppData\Local\Temp\_MEI{tempnumber}\data) found !

Il semble que la puissance de combat soit encore insuffisante.

Méthode

D'abord à partir de la structure de répertoires

Finalement, c'est devenu comme ça.

Je dois avoir plus de données tessdata dans les données, et je ne comprends pas la signification car le contenu est dupliqué. (Il y a peut-être une meilleure solution ...)

Ajout à * .spec

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['{main}.py'],
             pathex=['{src_dir}'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             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,
          Tree('{data}',prefix='data'),
          Tree('{tesseract}',prefix='tesseract'),
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='{appname}',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True , icon='icon.ico')

Il n'y a aucun changement ici.

{main}.py {} .py Aucune description particulière requise

pyinstaller! Maintenant que tu es prêt

$> pyinstaller --onefile --clean --icon={icon}.ico -n {appname} {main}.py

Et faites de {appname} .spec comme ci-dessus

$> pyinstaller {appname}.spec

Et distribuez {appname} .exe sous dist et vous êtes prêt à partir!

Il ne s'agit que d'une méthode d'environnement Windows, mais bien sûr, vous n'avez pas besoin d'installer Tesseract-OCR séparément sur le PC cible.

S'il y a un meilleur moyen, je vous serais reconnaissant si vous pouviez m'apprendre dans les commentaires sur Twitter ou ici!

Puis Otonoshi

Recommended Posts

À propos de AVERTISSEMENT lors de l'empaquetage avec pyinstaller en utilisant pyocr
Lors de l'utilisation d'optparse avec iPython
Lors de l'utilisation de MeCab avec python dans virtualenv
Précautions lors de l'utilisation de six avec Python 2.5
Avertissement lors de l'utilisation de TensorFlow sur Mac
Génération de clé secrète lors de l'utilisation d'EncryptedCookieStorage avec aiohttp_session
Précautions lors de l'utilisation de la bibliothèque google-cloud avec GAE / py
Qu'utilisez-vous lorsque vous testez avec Python?
Remarques sur avec
Histoire de l'utilisation du jeton logiciel de Resona avec 1Password
Précautions lors de l'utilisation de sqlite3 de macOS Sierra (10.12) avec le multitraitement
Je ne peux pas transformer un projet utilisant PyWebView en un exe avec PyInstaller
J'ai eu une erreur lors de l'utilisation de Tensorboard avec Pytorch
Lorsque vous utilisez le type Union avec pydantic, il est bon de le combiner avec Literal