[PYTHON] Über WARNUNG beim Verpacken mit Pyinstaller mit Pyocr

Einführung

Hallo, schön dich zu treffen, gute Nacht. Es tut mir Leid.

Die in diesem Artikel verfügbaren Informationen sind:

Reproduktion

  1. Installieren Sie Tesseract-OCR separat (Lehrer! Ich denke, dies ist die Hauptursache!)

  2. Schreiben Sie * .py mit dem entsprechenden Pyocr

  3. pyinstaller hoge.py

  4. Wenn Sie foo.exe mit dist ausspucken, wird das folgende Protokoll ausgegeben ...

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 !

Selbst wenn dies passiert, kann es ausgeführt werden, wenn Tesseract-OCR separat auf dem Ziel-PC installiert ist. Es gibt also nicht viele Menschen, die grundsätzlich in Schwierigkeiten sind ...

Da es jedoch schmutzig ist, werde ich es löschen.

Ursache

Ein kurzer Blick auf pyocr zeigt tesseract.py in der Nähe von Zeile: 120.

Das ist die Ursache.

    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']
            )

Es scheint, dass sie verschiedene Dinge tun, aber der Benutzer weiß das nicht (Weinen)

Anscheinend wäre es schön, wenn sys._MEIPASS Tesseract und Daten hätte.

Dann können Sie sys._MEIPASS Tesseract und Daten hinzufügen! Lösung! Begeisterung! Kampfbereit!

Fügen Sie Folgendes zu * .spec hinzu

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

Lauf!

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 !

Es scheint, dass die Kampfkraft immer noch unzureichend ist.

Methode

Zuerst aus der Verzeichnisstruktur

Schließlich wurde es so.

Ich verstehe die Bedeutung nicht, weil die Daten mehr Tessdaten enthalten müssen und der Inhalt dupliziert wird. (Vielleicht gibt es eine bessere Lösung ...)

Ergänzung zu * .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')

Hier ändert sich nichts.

{main}.py {} .py Keine spezielle Beschreibung erforderlich

pyinstaller! Jetzt wo du bereit bist

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

Und machen Sie {appname} .spec wie oben

$> pyinstaller {appname}.spec

Und verteilen Sie {appname} .exe unter dist und los geht's!

Dies ist nur eine Windows-Umgebungsmethode, aber Sie müssen Tesseract-OCR natürlich nicht separat auf dem Ziel-PC installieren.

Wenn es einen besseren Weg gibt, würde ich mich freuen, wenn Sie mich in den Kommentaren auf Twitter oder hier unterrichten könnten!

Dann Otonoshi

Recommended Posts

Über WARNUNG beim Verpacken mit Pyinstaller mit Pyocr
Bei Verwendung von optparse mit iPython
Bei Verwendung von MeCab mit virtualenv python
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Warnung bei Verwendung von TensorFlow auf einem Mac
Geheime Schlüsselgenerierung bei Verwendung von EncryptedCookieStorage mit aiohttp_session
Vorsichtsmaßnahmen bei Verwendung der Google Cloud-Bibliothek mit GAE / py
Was verwenden Sie beim Testen mit Python?
Anmerkungen zu mit
Geschichte der Verwendung von Resonas Software-Token mit 1Password
Vorsichtsmaßnahmen bei Verwendung von sqlite3 von macOS Sierra (10.12) mit Multiprocessing
Ich kann ein Projekt mit PyWebView mit PyInstaller nicht in eine Exe verwandeln
Bei der Verwendung von Tensorboard mit Pytorch ist ein Fehler aufgetreten
Wenn Sie den Union-Typ mit pydantic verwenden, ist es gut, ihn mit Literal zu kombinieren