88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
"""
|
|
PyPack - A Python to executable converter
|
|
Main entry point for the application
|
|
"""
|
|
from header_imports import *
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Convert Python scripts to executables')
|
|
parser.add_argument('--script_file', help='Python script or file to convert')
|
|
parser.add_argument('--output', help='Output executable name')
|
|
parser.add_argument('--name', help='Name of the executable')
|
|
parser.add_argument('--onefile', action='store_true', help='Create a single executable file')
|
|
parser.add_argument('--windowed', action='store_true', help='Create windowed application (no console)')
|
|
parser.add_argument('--debug', action='store_true', help='Enable debug mode')
|
|
parser.add_argument('--exclude', action='append', help='Exclude modules')
|
|
parser.add_argument('--include', action='append', help='Include additional modules')
|
|
parser.add_argument('--add-data', action='append', help='Add data files (format: src:dest)')
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Initialize logger
|
|
logger = Logger(debug=args.debug)
|
|
|
|
# Validate input script
|
|
script_path = Path(args.script_file)
|
|
if not script_path.exists():
|
|
logger.error(f"Script not found: {script_path}")
|
|
sys.exit(1)
|
|
|
|
if not script_path.suffix == '.py':
|
|
logger.error("Input must be a Python script (.py)")
|
|
sys.exit(1)
|
|
|
|
# Determine output name
|
|
if args.name:
|
|
output_name = args.name
|
|
elif args.output:
|
|
output_name = args.output
|
|
else:
|
|
output_name = script_path.stem
|
|
|
|
# Initialize configuration
|
|
config = ConfigManager(
|
|
script_path=script_path,
|
|
output_name=output_name,
|
|
onefile=args.onefile,
|
|
windowed=args.windowed,
|
|
debug=args.debug,
|
|
exclude_modules=args.exclude or [],
|
|
include_modules=args.include or [],
|
|
add_data=args.add_data or []
|
|
)
|
|
|
|
try:
|
|
logger.info(f"Converting Python {script_path} to executable...")
|
|
|
|
# Step 1: Analyze dependencies
|
|
logger.info("Analyzing dependencies...")
|
|
analyzer = DependencyAnalyzer(config, logger)
|
|
dependencies = analyzer.analyze()
|
|
|
|
# Step 2: Collect code and resources
|
|
logger.info("Collecting code and resources...")
|
|
collector = CodeCollector(config, logger)
|
|
collected_files = collector.collect(dependencies)
|
|
|
|
# Step 3: Compile to bytecode
|
|
logger.info("Compiling to bytecode...")
|
|
compiler = BytecodeCompiler(config, logger)
|
|
bytecode_files = compiler.compile(collected_files)
|
|
|
|
# Step 4: Build executable
|
|
logger.info("Building executable...")
|
|
builder = ExecutableBuilder(config, logger)
|
|
executable_path = builder.build(bytecode_files)
|
|
|
|
logger.info(f"Executable created: {executable_path}")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Build failed: {e}")
|
|
if args.debug:
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|