Files
StripStitch/StripStitch.spec
2026-04-22 09:26:39 +08:00

154 lines
4.9 KiB
Python

# -*- mode: python ; coding: utf-8 -*-
import os
from PyInstaller.utils.hooks import (
collect_data_files,
collect_dynamic_libs,
collect_submodules,
)
def _safe_collect_submodules(name: str):
try:
return collect_submodules(name)
except Exception:
return []
def _safe_collect_data_files(name: str):
try:
return collect_data_files(name)
except Exception:
return []
def _safe_collect_dynamic_libs(name: str):
try:
return collect_dynamic_libs(name)
except Exception:
return []
project_root = r"e:\code\vismatch-main\vismatch-main"
test_dir = os.path.join(project_root, "test")
script_path = os.path.join(test_dir, "StripStitch.py")
# Find the actual vismatch installation location (usually in site-packages)
import vismatch as _vismatch_pkg
vismatch_sitepkg_root = os.path.dirname(_vismatch_pkg.__file__)
hiddenimports = []
hiddenimports += _safe_collect_submodules("vismatch")
hiddenimports += _safe_collect_submodules("rasterio")
hiddenimports += _safe_collect_submodules("rasterio._base")
hiddenimports += _safe_collect_submodules("rasterio._io")
hiddenimports += _safe_collect_submodules("affine")
hiddenimports += _safe_collect_submodules("cv2")
hiddenimports += ["tif_caijain"]
hiddenimports += _safe_collect_submodules("pyproj")
hiddenimports += _safe_collect_submodules("scipy")
hiddenimports += _safe_collect_submodules("skimage")
hiddenimports += _safe_collect_submodules("SimpleITK")
hiddenimports += _safe_collect_submodules("pirt")
hiddenimports += _safe_collect_submodules("loguru")
# MatchAnything's src module - need to collect from third_party directory
# Add the src module path to pathex so PyInstaller can find it during analysis
matchanything_src_dir = os.path.join(vismatch_sitepkg_root, "third_party", "MatchAnything", "imcui", "third_party", "MatchAnything")
if os.path.isdir(matchanything_src_dir):
# Add to pathex for analysis
pass # Will be added to pathex in Analysis
# Also try to collect src submodules if they exist
try:
hiddenimports += _safe_collect_submodules("src")
except Exception:
pass
datas = []
datas += _safe_collect_data_files("vismatch")
datas += _safe_collect_data_files("rasterio")
datas += _safe_collect_data_files("pyproj")
# vismatch 的 third_party 下包含大量运行时动态 add_to_path 的源码(例如 matchanything 依赖的 src.*)。
# 这些 .py 文件不会被 collect_data_files 收集,需作为 datas 复制到 dist 里,并保持相对路径结构,
# 使得运行时 THIRD_PARTY_DIR = Path(vismatch.__file__).parent/"third_party" 可找到它们.
# Use the actual vismatch installation location (site-packages) instead of project root
# NOTE: Analysis() expects hook-style 2-tuples (source_dir, dest_dir), not Tree() TOC 3-tuples.
third_party_dir = os.path.join(vismatch_sitepkg_root, "third_party")
if os.path.isdir(third_party_dir):
datas.append((third_party_dir, os.path.join("vismatch", "third_party")))
# Include HuggingFace model weights for offline use (~/.cache/huggingface/hub/)
hf_cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "huggingface", "hub")
if os.path.isdir(hf_cache_dir):
for model_dir in os.listdir(hf_cache_dir):
if "vismatch" in model_dir.lower():
full_model_path = os.path.join(hf_cache_dir, model_dir)
if os.path.isdir(full_model_path):
datas.append((full_model_path, os.path.join("hub", model_dir)))
binaries = []
binaries += _safe_collect_dynamic_libs("rasterio")
binaries += _safe_collect_dynamic_libs("pyproj")
binaries += _safe_collect_dynamic_libs("cv2")
# Build pathex - include MatchAnything src directory for proper import analysis
pathex = [project_root, test_dir]
matchanything_src_dir = os.path.join(vismatch_sitepkg_root, "third_party", "MatchAnything", "imcui", "third_party", "MatchAnything")
if os.path.isdir(matchanything_src_dir):
pathex.append(matchanything_src_dir)
# Also add ROMA if it exists
roma_dir = os.path.join(vismatch_sitepkg_root, "third_party", "MatchAnything", "imcui", "third_party", "MatchAnything", "third_party", "ROMA")
if os.path.isdir(roma_dir):
pathex.append(roma_dir)
a = Analysis(
[script_path],
pathex=pathex,
binaries=binaries,
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name="StripStitch",
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=False,
upx_exclude=[],
name="StripStitch",
)