# -*- mode: python ; coding: utf-8 -*- """ PyInstaller 打包配置 """ import os import sys # 获取项目根目录 def get_abs_path(path): """获取绝对路径""" if os.path.isabs(path): return path return os.path.join(os.getcwd(), path) a = Analysis( ['main.py'], pathex=[os.getcwd()], binaries=[], datas=[ (get_abs_path('api'), 'api'), (get_abs_path('core'), 'core'), (get_abs_path('handlers'), 'handlers'), (get_abs_path('mirrors'), 'mirrors'), (get_abs_path('settings.json'), '.'), ], hiddenimports=[ # aiohttp 'aiohttp', 'aiohttp.abc', 'aiohttp.connector', 'aiohttp.client', 'aiohttp.client_proto', 'aiohttp.client_reqrep', 'aiohttp.cookiejar', 'aiohttp.fileresponse', 'aiohttp.hdrs', 'aiohttp.http_exceptions', 'aiohttp.http_parser', 'aiohttp.http_protocol', 'aiohttp.http_server', 'aiohttp.http_websocket', 'aiohttp.multipart', 'aiohttp.payload', 'aiohttp.proxy', 'aiohttp.streams', 'aiohttp.tcp_helpers', 'aiohttp.web', 'aiohttp.web_app', 'aiohttp.web_exceptions', 'aiohttp.web_fileresponse', 'aiohttp.web_log', 'aiohttp.web_middlewares', 'aiohttp.web_protocol', 'aiohttp.web_request', 'aiohttp.web_response', 'aiohttp.web_routedef', 'aiohttp.router', 'aiohttp.web_server', 'aiohttp.web_urldispatcher', 'aiohttp.web_ws', 'aiohttp.websocket', 'aiohttp.websocket_client', 'aiohttp.websocket_handshake', 'aiohttp.websocket_protocol', # aiohttp.multipart 'multipart', 'email.generator', 'email.policy', 'email.utils', # sqlalchemy 'sqlalchemy', 'sqlalchemy.engine', 'sqlalchemy.engine.base', 'sqlalchemy.engine.cursor', 'sqlalchemy.engine.default', 'sqlalchemy.engine.interfaces', 'sqlalchemy.engine.row', 'sqlalchemy.engine.util', 'sqlalchemy.orm', 'sqlalchemy.orm.base', 'sqlalchemy.orm.clear_mappers', 'sqlalchemy.orm.decl_api', 'sqlalchemy.orm.declarative', 'sqlalchemy.orm.descriptor_props', 'sqlalchemy.orm.interfaces', 'sqlalchemy.orm.mapper', 'sqlalchemy.orm.properties', 'sqlalchemy.orm.query', 'sqlalchemy.orm.relationships', 'sqlalchemy.orm.session', 'sqlalchemy.orm.strategies', 'sqlalchemy.orm.strategy_options', 'sqlalchemy.pool', 'sqlalchemy.pool.base', 'sqlalchemy.pool.impl', 'sqlalchemy.dialects', 'sqlalchemy.dialects.sqlite', 'sqlalchemy.dialects.postgresql', 'sqlalchemy.dialects.mysql', # apscheduler 'apscheduler', 'apscheduler.schedulers', 'apscheduler.schedulers.background', 'apscheduler.schedulers.base', 'apscheduler.schedulers.blocking', 'apscheduler.triggers', 'apscheduler.triggers.cron', 'apscheduler.triggers.date', 'apscheduler.triggers.interval', 'apscheduler.executors', 'apscheduler.executors.pool', 'apscheduler.job', 'apscheduler.events', # paramiko 'paramiko', 'paramiko.transport', 'paramiko.client', 'paramiko.config', 'paramiko.hostkeys', 'paramiko.message', 'paramiko.packet', 'paramiko.primitives', 'paramiko.util', 'paramiko.ecdh', 'paramiko.ed25519key', 'paramiko.rsakey', 'paramiko.dsskey', 'paramiko.pkey', 'paramiko.agent', 'paramiko.sftp', 'paramiko.sftp_attr', 'paramiko.sftp_handle', 'paramiko.sftp_server', 'paramiko.sftp_si', 'paramiko.ssh_exception', 'paramiko.auth_handler', 'paramiko.channel', 'paramiko.shell', 'paramiko.exec', # requests 'requests', 'requests.api', 'requests.auth', 'requests.certs', 'requests.compat', 'requests.cookies', 'requests.exceptions', 'requests.hooks', 'requests.models', 'requests.sessions', 'requests.status_codes', 'requests.structures', 'requests.utils', # pymysql 'pymysql', 'pymysql.connections', 'pymysql.cursors', 'pymysql.converters', 'pymysql.err', 'pymysql.optionfile', 'pymysql.protocol', 'pymysql.times', 'pymysql.constants', 'pymysql.charset', # psycopg2 'psycopg2', 'psycopg2._psycopg2', 'psycopg2.sql', 'psycopg2.extensions', 'psycopg2.extras', # cryptography 'cryptography', 'cryptography.hazmat', 'cryptography.hazmat.backends', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives.hashes', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives.kdf.pbkdf2', 'cryptography.x509', 'cryptography.x509.name', 'cryptography.x509.extensions', 'cryptography.fernet', # 其他常用 'urllib3', 'urllib3.util', 'urllib3.exceptions', 'urllib3.request', 'urllib3.response', 'urllib3.poolmanager', 'charset_normalizer', 'charset_normalizer.utils', 'charset_normalizer.models', 'idna', 'idna.core', 'idna.idnadata', 'cachetools', 'croniter', 'psutil', 'psutil._psutil_linux', 'psutil._psutil_osx', 'psutil._psutil_windows', 'python_multipart', 'python_multipart.multipart', 'dataclasses', 'inspect', 'concurrent.futures', 'subprocess', 'threading', 'socket', 'ssl', 'hmac', 'hashlib', 'base64', 'struct', 'tempfile', 'shutil', 'pickle', 'json', 'os', 'sys', 'signal', 'time', 'datetime', 'math', 'logging', 'warnings', 'ctypes', 'ctypes.util', 'ctypes.wintypes', '_ctypes', '_socket', '_ssl', 'select', 'errno', 'fcntl', 'grp', 'pwd', 'termios', 'tty', 'fcntl', 'resource', 'msvcrt', 'win32api', 'win32con', 'win32file', 'pywintypes', 'pythoncom', # pyasn1 (paramiko 依赖) 'pyasn1', 'pyasn1.type', 'pyasn1.codec', 'pyasn1.codec.der', 'pyasn1.codec.der.encoder', 'pyasn1.codec.der.decoder', 'pyasn1.util', 'pyasn1.error', # bcrypt (cryptography 依赖) 'bcrypt', 'bcrypt.__about__', # cffi (cryptography 依赖) 'cffi', 'cffi.api', 'cffi.ffiplatform', 'cffi.backend_ctypes', 'cffi.recompiler', 'cffi.verifier', # packaging (cryptography 依赖) 'packaging', 'packaging.version', 'packaging.specifiers', 'packaging.requirements', # six (paramiko 依赖) 'six', # ipaddress (paramiko 依赖) 'ipaddress', # json (标准库) 'json.decoder', 'json.encoder', # typing 'typing_extensions', ], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=None) # 使用 EXE() 创建 --onefile 单文件模式 exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='hyc-download', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], console=True, )