Не получается скомпилировать python скрипт через Pyinstaller

В моем коде используется две библиотеки - python-docx и pylibdmtx. Первая читает docx файл, а вторая преобразует некоторый текст в qr-коды. При попытке скомпилировать скрипт ошибок нет, но при запуске консоль сразу закрывается из-за ошибки. В файле warn-start.txt содержится множество предупреждений о не найденных модулях. Я выяснил, что проблему вызывает pylibdmtx, но не могу разобраться, в чем именно состоит проблема, так как первый раз компилирую скрипт.

import ctypes
ctypes.windll.kernel32.SetDllDirectoryW(None)
#from pylibdmtx.pylibdmtx import encode
#from PIL import Image
import docx,os
from docx.document import Document as _Document
from docx.oxml.text.paragraph import CT_P
from docx.oxml.table import CT_Tbl
from docx.table import _Cell, Table
from docx.text.paragraph import Paragraph

name=input('Введите точное название файла без расширения: ')+'.docx'
#def create_qr(text):
 #   encoded = encode(text.encode('utf8'))
  #  img = Image.frombytes('RGB', (encoded.width, encoded.height), encoded.pixels)
   # img.save('qrcode.png')

def delete_paragraph(paragraph):
    p = paragraph._element
    p.getparent().remove(p)
    p._p = p._element = None

def delete_row(table, row):
    tbl = table._tbl
    tr = row._tr
    tbl.remove(tr)

def iter_block_items(parent):
    """
    Generate a reference to each paragraph and table child within *parent*,
    in document order. Each returned value is an instance of either Table or
    Paragraph. *parent* would most commonly be a reference to a main
    Document object, but also works for a _Cell object, which itself can
    contain paragraphs and tables.
    """
    if isinstance(parent, _Document):
        parent_elm = parent.element.body
        # print(parent_elm.xml)
    elif isinstance(parent, _Cell):
        parent_elm = parent._tc
    else:
        raise ValueError("something's not right")

    for child in parent_elm.iterchildren():
        if isinstance(child, CT_P):
            yield Paragraph(child, parent)
        elif isinstance(child, CT_Tbl):
            yield Table(child, parent)

a = ord('а')
s=''.join([chr(i) for i in range(a,a+32)])
doc = docx.Document(name)
doc_list=[]
for block in iter_block_items(doc):
    if isinstance(block, Paragraph):
        if len(block.text) > 3 and block.text != '\ufeff***':
            doc_list.append(block.text)
    else:
        for row in (block.rows):
            if len(row.cells[0].text)==83:
                doc_list.append(row.cells[0].text)

doc=docx.Document()
for blocks in doc_list:
    ok=0
    for i in blocks.lower():
        if i in s:
            ok=1
            break
    if ok == 0:
        #create_qr(blocks)
        #doc.add_picture('qrcode.png', width = docx.shared.Cm(1.5))
        #os.remove('qrcode.png')
        pass
    else:
        doc.add_paragraph(blocks)
new_name=input('Введите имя нового файла без расширения: ')+'.docx'
doc.save(new_name)
print('Готово')
a=input()

Вот файл warn-start.txt

missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named pep517 - imported by importlib.metadata (delayed)
missing module named urllib.urlopen - imported by urllib (delayed, optional), lxml.html (delayed, optional)
missing module named urllib.urlencode - imported by urllib (delayed, optional), lxml.html (delayed, optional)
missing module named 'org.python' - imported by pickle (optional), xml.sax (delayed, conditional)
missing module named pwd - imported by posixpath (delayed, conditional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), http.server (delayed, optional), webbrowser (delayed), netrc (delayed, conditional), getpass (delayed), distutils.util (delayed, conditional, optional)
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional)
missing module named resource - imported by posix (top-level), test.support (delayed, conditional, optional)
missing module named org - imported by copy (optional)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named termios - imported by tty (top-level), getpass (optional)
missing module named 'java.lang' - imported by platform (delayed, optional), xml.sax._exceptions (conditional)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named _posixsubprocess - imported by subprocess (optional), multiprocessing.util (delayed)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named fcntl - imported by subprocess (optional)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named pyimod03_importers - imported by C:\Users\toyot\AppData\Local\Programs\Python\Python310\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (top-level)
missing module named StringIO - imported by docx.compat (conditional)
missing module named htmlentitydefs - imported by lxml.html.soupparser (optional)
missing module named BeautifulSoup - imported by lxml.html.soupparser (optional)
missing module named bs4 - imported by lxml.html.soupparser (optional)
missing module named urlparse - imported by lxml.ElementInclude (optional), lxml.html (optional), lxml.html.html5parser (optional)
missing module named urllib2 - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
missing module named 'html5lib.treebuilders' - imported by lxml.html.html5parser (top-level)
missing module named html5lib - imported by lxml.html._html5builder (top-level), lxml.html.html5parser (top-level)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named _winreg - imported by platform (delayed, optional)
missing module named readline - imported by cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional)
missing module named cssselect - imported by lxml.cssselect (optional)

При помощи программы вытащил названия всех ненайденных модулей и попытался вставить их в --hiden-imports, но это не дало результата. Компилировал как в один файл, так и в несколько. В текущем виде (со строками в коментариях) скрипт успешно компилируется и работает, не используя qr-коды.

Оригинальный скрипт после компиляции при запуске выдает такую ошибку: введите сюда описание изображения


Ответы (1 шт):

Автор решения: Konstantin

Есть вариант проще, без создания .exe.

  1. Скачиваете embedded python и устанавливаете туда все свои зависимости (например)
  2. На файл main.py (основной скрипт запуска программы) делаете файл запуска (например run.bat) главного скрипта (того который запускает вашу программу) что-то вроде того:
    @echo off 
    python main.py %*
  1. Создаете ярлык который указывает на run.bat, все portable-версия программы готова.

3.1. Если вам нужен инсталлятор (что бы все как у всех: ярлык на рабочем столе, установка/удаление как у всех программ и пр.), сделайте его например так с указанием на файл запуска run.bat: (например)

→ Ссылка