Сборка Pyinstaller 3.3.1 и 3.4.0-dev с помощью apscheduler

Приветствие!

Я пытаюсь сделать сборку с помощью PyInstaller. Конфигурация: Python 3.6.5pip 10.0.1, ОС: Ubuntu 18.04. Используя virtualenv (также пробовал с python -m venv).

Мое приложение использует apscheduler, websocket, _thread, и кажется, что у некоторых связанных модулей есть проблемы с импортом. Пробовал pyinstaller --onefile mymain.spec и pyinstaller --onedir mymain.spec. Проблема сохраняется в обоих случаях. Программа работает без ошибок, если не зависает.

вот ошибка, который я получаю, если пытаюсь запустить сгенерированный исполняемый файл:

Traceback (most recent call last):
  File "apscheduler/schedulers/base.py", line 882, in _create_plugin_instance
KeyError: 'interval'

During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "cmonitorcli/services/socket_client.py", line 70, in run
      File "cmonitorcli/services/scheduler.py", line 36, in add_update_job
      File "apscheduler/schedulers/base.py", line 413, in add_job
      File "apscheduler/schedulers/base.py", line 907, in _create_trigger
      File "apscheduler/schedulers/base.py", line 890, in _create_plugin_instance
    LookupError: No trigger by the name "interval" was found
    ^CTraceback (most recent call last):
      File "websocket/_app.py", line 283, in run_forever
      File "websocket/_app.py", line 50, in read
    KeyboardInterrupt

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "cmonitorcli/main.py", line 20, in <module>
      File "cmonitorcli/main.py", line 8, in main_job
      File "cmonitorcli/client.py", line 29, in __init__
      File "cmonitorcli/services/socket_client.py", line 31, in connect
      File "websocket/_app.py", line 283, in run_forever
    KeyboardInterrupt

Модули импортируют предупреждения:

missing module named 'multiprocessing.forking' - imported by /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/venv/lib/python3.6/site-packages/PyInstaller/loader/rthooks/pyi_rth_multiprocessing.py
missing module named multiprocessing.get_context - imported by multiprocessing, multiprocessing.pool, multiprocessing.managers, multiprocessing.sharedctypes
missing module named multiprocessing.TimeoutError - imported by multiprocessing, multiprocessing.pool
missing module named multiprocessing.BufferTooShort - imported by multiprocessing, multiprocessing.connection
missing module named multiprocessing.AuthenticationError - imported by multiprocessing, multiprocessing.connection
missing module named multiprocessing.set_start_method - imported by multiprocessing, multiprocessing.spawn
missing module named multiprocessing.get_start_method - imported by multiprocessing, multiprocessing.spawn
missing module named multiprocessing.SimpleQueue - imported by multiprocessing, concurrent.futures.process
missing module named pyimod03_importers - imported by /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/venv/lib/python3.6/site-packages/PyInstaller/loader/rthooks/pyi_rth_pkgres.py
missing module named 'pkg_resources.extern.pyparsing' - imported by pkg_resources._vendor.packaging.requirements, pkg_resources._vendor.packaging.markers
missing module named StringIO - imported by six, pkg_resources._vendor.six
missing module named 'win32com.shell' - imported by pkg_resources._vendor.appdirs
missing module named 'com.sun' - imported by pkg_resources._vendor.appdirs
missing module named com - imported by pkg_resources._vendor.appdirs
missing module named win32api - imported by pkg_resources._vendor.appdirs
missing module named win32com - imported by pkg_resources._vendor.appdirs
missing module named 'ctypes.macholib' - imported by ctypes.util
missing module named netbios - imported by uuid
missing module named win32wnet - imported by uuid
missing module named __builtin__ - imported by pkg_resources._vendor.pyparsing
missing module named ordereddict - imported by pkg_resources._vendor.pyparsing
missing module named __main__ - imported by pkg_resources
missing module named pkg_resources.extern.packaging - imported by pkg_resources.extern, pkg_resources
missing module named pkg_resources.extern.appdirs - imported by pkg_resources.extern, pkg_resources
missing module named 'pkg_resources.extern.six.moves' - imported by pkg_resources, pkg_resources._vendor.packaging.requirements
missing module named pkg_resources.extern.six - imported by pkg_resources.extern, pkg_resources
missing module named nt - imported by os, shutil, ntpath, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named org - imported by pickle, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
excluded module named _frozen_importlib - imported by importlib, importlib.abc, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named _frozen_importlib_external - imported by importlib._bootstrap, importlib, importlib.abc, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named _winreg - imported by platform, tzlocal.win32, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py, pkg_resources._vendor.appdirs
missing module named _scproxy - imported by urllib.request
missing module named java - imported by platform, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named 'java.lang' - imported by platform, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py, xml.sax._exceptions
missing module named vms_lib - imported by platform, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named winreg - imported by platform, mimetypes, tzlocal.win32, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py, urllib.request
missing module named msvcrt - imported by subprocess, multiprocessing.spawn, multiprocessing.popen_spawn_win32, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py, getpass
missing module named _winapi - imported by subprocess, multiprocessing.reduction, multiprocessing.connection, multiprocessing.heap, multiprocessing.popen_spawn_win32, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named _dummy_threading - imported by dummy_threading, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py
missing module named 'org.python' - imported by copy, /home/hoop/PycharmProjects/cmonitorserv/cmonitorcli/main.py, xml.sax
missing module named funcsigs - imported by apscheduler.util
missing module named sets - imported by pytz.tzinfo
missing module named UserDict - imported by pytz.lazy
missing module named wsaccel - imported by websocket._utils
missing module named backports - imported by websocket._ssl_compat
missing module named socks - imported by websocket._http
missing module named "'six.moves.urllib'.parse" - imported by websocket._url
missing module named Cookie - imported by websocket._cookiejar
missing module named 'wsaccel.xormask' - imported by websocket._abnf
missing module named numpy - imported by websocket._abnf
missing module named win32evtlog - imported by logging.handlers
missing module named win32evtlogutil - imported by logging.handlers

requirements.txt:

jsonpickle==0.9.6
pkg-resources==0.0.0
six==1.11.0
websocket-client==0.48.0
apscheduler==3.5.1
pyinstaller==3.3.1

мне нужно сделать сборку --onefile.

Обратите внимание, например, на использование hiddenimports с этими:

missing module named 'wsaccel.xormask' - imported by websocket._abnf
missing module named numpy - imported by websocket._abnf
missing module named win32evtlog - imported by logging.handlers

и любые другие модули не помогают - они все равно появляются в журнале с флагом missing module

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
0
1 373
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

pyinstaller --onefile. После этого - загляните в .spec. Все недостающие модули добавляем вручную. У Pyinstaller есть ошибка с этой "спецификацией автоконфигурации"

мне нужно иметь исполняемый файл в одном файле

user1935987 02.07.2018 15:26

привет спасибо, но мне нужно, чтобы это был исполняемый файл

user1935987 02.07.2018 15:41

так что --onefile это решение.

Yaroslav 04.07.2018 09:44

--onefile, затем просмотрите и исправьте ваш .spec файл => pyinstaller --onefile yourCorrected.spec еще раз

Yaroslav 04.07.2018 09:46

с самим --onefile проблем нет

user1935987 17.07.2018 21:35

Проблема заключается в том, что pyinstaller не упаковывает точки входа в setuptools, которые требуются APScheduler для поиска классов триггеров. Обходной путь - импортировать и использовать триггеры вручную.

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

user1935987 14.07.2018 22:41

С какой частью у вас проблемы? Импортировать триггеры или создать их экземпляры? Или найти документацию по API?

Alex Grönholm 16.07.2018 13:03

я не совсем понимаю твой ответ. Я просмотрел документ несколько раз и обнаружил, что могу использовать этот рецепт github.com/pyinstaller/pyinstaller/wiki/…, но похоже, что это не для этого случая. Я не понимаю, что это за триггеры для импорта - вы хотите импортировать все missing module из журнала ошибок через hiddenimports или перехватить? или есть какие-то конкретные депы для apscheduler, которые нужно искать?

user1935987 16.07.2018 17:07

Вместо того, чтобы APScheduler просматривал классы триггеров при добавлении заданий, вы должны импортировать и создавать их экземпляры самостоятельно и передавать их в add_job() вместо имени точки входа (например, «cron»). В документации по API есть полный список всех встроенных классов триггеров.

Alex Grönholm 18.07.2018 09:03

хорошо, теперь ясно. Хотя я был сконцентрирован на самом сборке и импорте сборки, было непонятно, имеет ли вы в виду использование apscheduler.

user1935987 18.07.2018 16:45
Ответ принят как подходящий

На основании ответа Alex Grönholm:

Проблема действительно заключалась в том, что APScheduler использовал точки входа setuptools для поиска классов триггеров.

Решение состоит в том, чтобы создать экземпляр триггера и передать его add_job():

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers import interval

scheduler = BackgroundScheduler()

trigger = interval.IntervalTrigger(seconds=3)
scheduler.add_job(lambda: job_func(ws), trigger=trigger, id='status_update_job', replace_existing=True)

Другие вопросы по теме