fix
This commit is contained in:
@@ -1,130 +1,81 @@
|
|||||||
# -*- mode: python ; coding: utf-8 -*-
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
"""
|
|
||||||
PyInstaller配置文件 - MixVideo V2 Python Core
|
|
||||||
用于将Python代码打包成独立可执行文件
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
block_cipher = None
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
# 获取当前目录
|
|
||||||
current_dir = Path(__file__).parent
|
|
||||||
project_root = current_dir.parent
|
|
||||||
|
|
||||||
# 添加隐藏导入(确保所有模块都被包含)
|
|
||||||
hiddenimports = [
|
|
||||||
# 核心模块
|
|
||||||
'python_core',
|
|
||||||
'python_core.config',
|
|
||||||
'python_core.utils',
|
|
||||||
'python_core.utils.logger',
|
|
||||||
'python_core.utils.jsonrpc',
|
|
||||||
'python_core.utils.helpers',
|
|
||||||
'python_core.utils.validators',
|
|
||||||
|
|
||||||
# 服务模块
|
|
||||||
'python_core.services',
|
|
||||||
'python_core.services.template_manager',
|
|
||||||
'python_core.services.project_manager',
|
|
||||||
'python_core.services.media_manager',
|
|
||||||
'python_core.services.audio_manager',
|
|
||||||
'python_core.services.model_manager',
|
|
||||||
'python_core.services.resource_category_manager',
|
|
||||||
'python_core.services.file_manager',
|
|
||||||
|
|
||||||
# AI视频模块
|
|
||||||
'python_core.ai_video',
|
|
||||||
'python_core.ai_video.video_generator',
|
|
||||||
'python_core.ai_video.api_client',
|
|
||||||
'python_core.ai_video.cloud_storage',
|
|
||||||
|
|
||||||
# 处理模块
|
|
||||||
'python_core.audio_processing',
|
|
||||||
'python_core.audio_processing.core',
|
|
||||||
'python_core.video_processing',
|
|
||||||
'python_core.video_processing.core',
|
|
||||||
|
|
||||||
# 第三方依赖
|
|
||||||
'requests',
|
|
||||||
'PIL',
|
|
||||||
'Pillow',
|
|
||||||
'numpy',
|
|
||||||
'opencv-python',
|
|
||||||
'cv2',
|
|
||||||
'json',
|
|
||||||
'sqlite3',
|
|
||||||
'pathlib',
|
|
||||||
'uuid',
|
|
||||||
'hashlib',
|
|
||||||
'base64',
|
|
||||||
'urllib',
|
|
||||||
'urllib.parse',
|
|
||||||
'urllib.request',
|
|
||||||
'http',
|
|
||||||
'http.client',
|
|
||||||
'ssl',
|
|
||||||
'certifi',
|
|
||||||
]
|
|
||||||
|
|
||||||
# 数据文件(包含配置文件、模板等)
|
|
||||||
datas = [
|
|
||||||
# 配置文件
|
|
||||||
(str(current_dir / '*.json'), '.'),
|
|
||||||
(str(current_dir / '*.yaml'), '.'),
|
|
||||||
(str(current_dir / '*.yml'), '.'),
|
|
||||||
|
|
||||||
# 模板文件
|
|
||||||
(str(project_root / 'assets' / 'templates'), 'assets/templates'),
|
|
||||||
|
|
||||||
# 其他资源文件
|
|
||||||
(str(project_root / 'assets' / 'icons'), 'assets/icons'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# 二进制文件(如果有的话)
|
|
||||||
binaries = []
|
|
||||||
|
|
||||||
# 排除的模块(减少打包大小)
|
|
||||||
excludes = [
|
|
||||||
'tkinter',
|
|
||||||
'matplotlib',
|
|
||||||
'scipy',
|
|
||||||
'pandas',
|
|
||||||
'jupyter',
|
|
||||||
'notebook',
|
|
||||||
'IPython',
|
|
||||||
'pytest',
|
|
||||||
'unittest',
|
|
||||||
'test',
|
|
||||||
'tests',
|
|
||||||
'_pytest',
|
|
||||||
'setuptools',
|
|
||||||
'pip',
|
|
||||||
'wheel',
|
|
||||||
'distutils',
|
|
||||||
]
|
|
||||||
|
|
||||||
# 分析配置
|
|
||||||
a = Analysis(
|
a = Analysis(
|
||||||
[str(current_dir / 'main.py')],
|
['main.py'],
|
||||||
pathex=[str(current_dir), str(project_root)],
|
pathex=[],
|
||||||
binaries=binaries,
|
binaries=[],
|
||||||
datas=datas,
|
datas=[],
|
||||||
hiddenimports=hiddenimports,
|
hiddenimports=[
|
||||||
|
'python_core',
|
||||||
|
'python_core.config',
|
||||||
|
'python_core.utils',
|
||||||
|
'python_core.utils.logger',
|
||||||
|
'python_core.utils.jsonrpc',
|
||||||
|
'python_core.utils.helpers',
|
||||||
|
'python_core.utils.validators',
|
||||||
|
'python_core.services',
|
||||||
|
'python_core.services.template_manager',
|
||||||
|
'python_core.services.project_manager',
|
||||||
|
'python_core.services.media_manager',
|
||||||
|
'python_core.services.audio_manager',
|
||||||
|
'python_core.services.model_manager',
|
||||||
|
'python_core.services.resource_category_manager',
|
||||||
|
'python_core.services.file_manager',
|
||||||
|
'python_core.ai_video',
|
||||||
|
'python_core.ai_video.video_generator',
|
||||||
|
'python_core.ai_video.api_client',
|
||||||
|
'python_core.ai_video.cloud_storage',
|
||||||
|
'python_core.audio_processing',
|
||||||
|
'python_core.audio_processing.core',
|
||||||
|
'python_core.video_processing',
|
||||||
|
'python_core.video_processing.core',
|
||||||
|
'requests',
|
||||||
|
'PIL',
|
||||||
|
'json',
|
||||||
|
'sqlite3',
|
||||||
|
'pathlib',
|
||||||
|
'uuid',
|
||||||
|
'hashlib',
|
||||||
|
'base64',
|
||||||
|
'urllib',
|
||||||
|
'urllib.parse',
|
||||||
|
'urllib.request',
|
||||||
|
'http',
|
||||||
|
'http.client',
|
||||||
|
'ssl',
|
||||||
|
'certifi',
|
||||||
|
],
|
||||||
hookspath=[],
|
hookspath=[],
|
||||||
hooksconfig={},
|
hooksconfig={},
|
||||||
runtime_hooks=[],
|
runtime_hooks=[],
|
||||||
excludes=excludes,
|
excludes=[
|
||||||
|
'tkinter',
|
||||||
|
'matplotlib',
|
||||||
|
'scipy',
|
||||||
|
'pandas',
|
||||||
|
'jupyter',
|
||||||
|
'notebook',
|
||||||
|
'IPython',
|
||||||
|
'pytest',
|
||||||
|
'unittest',
|
||||||
|
'test',
|
||||||
|
'tests',
|
||||||
|
'_pytest',
|
||||||
|
'setuptools',
|
||||||
|
'pip',
|
||||||
|
'wheel',
|
||||||
|
'distutils',
|
||||||
|
],
|
||||||
win_no_prefer_redirects=False,
|
win_no_prefer_redirects=False,
|
||||||
win_private_assemblies=False,
|
win_private_assemblies=False,
|
||||||
cipher=None,
|
cipher=block_cipher,
|
||||||
noarchive=False,
|
noarchive=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
# 处理PYZ
|
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
||||||
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
|
|
||||||
|
|
||||||
# 可执行文件配置
|
|
||||||
exe = EXE(
|
exe = EXE(
|
||||||
pyz,
|
pyz,
|
||||||
a.scripts,
|
a.scripts,
|
||||||
@@ -139,23 +90,10 @@ exe = EXE(
|
|||||||
upx=True,
|
upx=True,
|
||||||
upx_exclude=[],
|
upx_exclude=[],
|
||||||
runtime_tmpdir=None,
|
runtime_tmpdir=None,
|
||||||
console=True, # 保持控制台模式,便于调试
|
console=True,
|
||||||
disable_windowed_traceback=False,
|
disable_windowed_traceback=False,
|
||||||
argv_emulation=False,
|
argv_emulation=False,
|
||||||
target_arch=None,
|
target_arch=None,
|
||||||
codesign_identity=None,
|
codesign_identity=None,
|
||||||
entitlements_file=None,
|
entitlements_file=None,
|
||||||
icon=str(project_root / 'src-tauri' / 'icons' / 'icon.ico') if (project_root / 'src-tauri' / 'icons' / 'icon.ico').exists() else None,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# 如果需要创建目录分发版本(可选)
|
|
||||||
# coll = COLLECT(
|
|
||||||
# exe,
|
|
||||||
# a.binaries,
|
|
||||||
# a.zipfiles,
|
|
||||||
# a.datas,
|
|
||||||
# strip=False,
|
|
||||||
# upx=True,
|
|
||||||
# upx_exclude=[],
|
|
||||||
# name='mixvideo-python-core'
|
|
||||||
# )
|
|
||||||
|
|||||||
43
python_core/build_simple.spec
Normal file
43
python_core/build_simple.spec
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
|
|
||||||
|
block_cipher = None
|
||||||
|
|
||||||
|
a = Analysis(
|
||||||
|
['main_simple.py'],
|
||||||
|
pathex=[],
|
||||||
|
binaries=[],
|
||||||
|
datas=[],
|
||||||
|
hiddenimports=[],
|
||||||
|
hookspath=[],
|
||||||
|
hooksconfig={},
|
||||||
|
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,
|
||||||
|
a.scripts,
|
||||||
|
a.binaries,
|
||||||
|
a.zipfiles,
|
||||||
|
a.datas,
|
||||||
|
[],
|
||||||
|
name='mixvideo-python-core',
|
||||||
|
debug=False,
|
||||||
|
bootloader_ignore_signals=False,
|
||||||
|
strip=False,
|
||||||
|
upx=True,
|
||||||
|
upx_exclude=[],
|
||||||
|
runtime_tmpdir=None,
|
||||||
|
console=True,
|
||||||
|
disable_windowed_traceback=False,
|
||||||
|
argv_emulation=False,
|
||||||
|
target_arch=None,
|
||||||
|
codesign_identity=None,
|
||||||
|
entitlements_file=None,
|
||||||
|
)
|
||||||
48
python_core/build_test.bat
Normal file
48
python_core/build_test.bat
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
@echo off
|
||||||
|
REM 测试PyInstaller构建
|
||||||
|
|
||||||
|
echo 🔨 Testing PyInstaller build...
|
||||||
|
|
||||||
|
REM 检查Python
|
||||||
|
python --version
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo ❌ Python not found
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
REM 检查PyInstaller
|
||||||
|
python -m PyInstaller --version
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Installing PyInstaller...
|
||||||
|
python -m pip install pyinstaller
|
||||||
|
)
|
||||||
|
|
||||||
|
REM 清理之前的构建
|
||||||
|
if exist build rmdir /s /q build
|
||||||
|
if exist dist rmdir /s /q dist
|
||||||
|
|
||||||
|
REM 构建简化版本
|
||||||
|
echo Building simplified version...
|
||||||
|
python -m PyInstaller --onefile --console --name mixvideo-python-core main_simple.py
|
||||||
|
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo ❌ Build failed
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
REM 测试可执行文件
|
||||||
|
echo Testing executable...
|
||||||
|
dist\mixvideo-python-core.exe --version
|
||||||
|
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo ❌ Executable test failed
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
echo ✅ Build successful!
|
||||||
|
echo Executable location: dist\mixvideo-python-core.exe
|
||||||
|
|
||||||
|
pause
|
||||||
@@ -17,12 +17,22 @@ sys.path.insert(0, str(current_dir))
|
|||||||
|
|
||||||
# 导入核心模块
|
# 导入核心模块
|
||||||
try:
|
try:
|
||||||
from utils.logger import get_logger
|
from python_core.utils.logger import get_logger
|
||||||
from utils.jsonrpc import create_response_handler, create_progress_reporter
|
from python_core.utils.jsonrpc import create_response_handler, create_progress_reporter
|
||||||
from config import get_config
|
from python_core.config import get_config
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
print(f"ERROR: Failed to import core modules: {e}", file=sys.stderr)
|
print(f"ERROR: Failed to import core modules: {e}", file=sys.stderr)
|
||||||
sys.exit(1)
|
# 尝试备用导入方式
|
||||||
|
try:
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
sys.path.insert(0, os.path.dirname(__file__))
|
||||||
|
from utils.logger import get_logger
|
||||||
|
from utils.jsonrpc import create_response_handler, create_progress_reporter
|
||||||
|
from config import get_config
|
||||||
|
except ImportError as e2:
|
||||||
|
print(f"ERROR: Failed to import with backup method: {e2}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# 模块映射表
|
# 模块映射表
|
||||||
MODULE_MAP = {
|
MODULE_MAP = {
|
||||||
@@ -84,7 +94,11 @@ def load_module_function(module_name, function_name):
|
|||||||
module_path = module_name
|
module_path = module_name
|
||||||
|
|
||||||
# 导入模块
|
# 导入模块
|
||||||
module = __import__(f"python_core.{module_path}", fromlist=[function_name])
|
try:
|
||||||
|
module = __import__(f"python_core.{module_path}", fromlist=[function_name])
|
||||||
|
except ImportError:
|
||||||
|
# 备用导入方式
|
||||||
|
module = __import__(module_path, fromlist=[function_name])
|
||||||
|
|
||||||
# 获取函数
|
# 获取函数
|
||||||
if hasattr(module, function_name):
|
if hasattr(module, function_name):
|
||||||
|
|||||||
43
python_core/main_simple.py
Normal file
43
python_core/main_simple.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
MixVideo V2 Python Core - 简化版入口文件
|
||||||
|
用于测试PyInstaller打包
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""简化的主函数"""
|
||||||
|
parser = argparse.ArgumentParser(description='MixVideo V2 Python Core')
|
||||||
|
|
||||||
|
parser.add_argument('--module', '-m', required=False, default='test',
|
||||||
|
help='Module name')
|
||||||
|
|
||||||
|
parser.add_argument('--action', '-a', required=False, default='hello',
|
||||||
|
help='Action to execute')
|
||||||
|
|
||||||
|
parser.add_argument('--params', '-p', type=str,
|
||||||
|
help='Parameters as JSON string')
|
||||||
|
|
||||||
|
parser.add_argument('--version', action='version', version='MixVideo V2 Python Core 2.0.0')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# 简单的响应
|
||||||
|
result = {
|
||||||
|
"status": True,
|
||||||
|
"message": f"Hello from {args.module}.{args.action}",
|
||||||
|
"data": {
|
||||||
|
"module": args.module,
|
||||||
|
"action": args.action,
|
||||||
|
"params": args.params
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print(json.dumps(result))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
Reference in New Issue
Block a user