Pyinstaller 3.3.1 & 3.4.0-dev build with apscheduler

。_饼干妹妹 提交于 2020-03-21 11:42:36

问题


Greeting!

I'm trying to make a build using PyInstaller. Config: Python 3.6.5 pip 10.0.1, OS: Ubuntu 18.04. Using virtualenv (also tried with python -m venv).

My app using an apscheduler, websocket, _thread and it seems like some related modules have import problems. Tried pyinstaller --onefile mymain.spec & pyinstaller --onedir mymain.spec. Problem persists in both cases. Program working without errors if not frozen.

here is the error i'm getting if i try to run the generated executable:

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

Modules imports warnings:

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

i need to make a --onefile build.

Note the for example using hiddenimports with these:

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

and any other modules don't help - they still appear in log with missing module flag


回答1:


Based on Alex Grönholm reply:

The issue was indeed because APScheduler using a setuptools entry points to look up the trigger classes.

Solution is to instantiate trigger and pass to 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)



回答2:


The problem lies with the fact that pyinstaller does not package setuptools entry points which are required by APScheduler to look up the trigger classes. The workaround is to import and use the triggers manually.




回答3:


pyinstaller --onefile. After that - look into .spec. All missing modules add manually. Pyinstaller have a bug with that "autoconfig spec"



来源:https://stackoverflow.com/questions/51124464/pyinstaller-3-3-1-3-4-0-dev-build-with-apscheduler

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!