| #!/usr/bin/env python3 | |
| import argparse | |
| import glob | |
| import pathlib | |
| from importlib.machinery import PathFinder | |
| from importlib.metadata import DistributionFinder | |
| from installer import install | |
| from installer._core import _process_WHEEL_file | |
| from installer.destinations import SchemeDictionaryDestination | |
| from installer.sources import WheelFile | |
| def clean(source, destination): | |
| scheme = _process_WHEEL_file(source) | |
| scheme_path = destination.scheme_dict[scheme] | |
| context = DistributionFinder.Context( | |
| name=source.distribution, | |
| path=[scheme_path], | |
| ) | |
| for path in PathFinder.find_distributions(context=context): | |
| # path.files is either an iterable, or None | |
| if path.files is None: | |
| continue | |
| for file in path.files: | |
| file_path = pathlib.Path(file.locate()) | |
| if file_path.exists(): | |
| file_path.unlink() | |
| def main(): | |
| """Entry point for CLI.""" | |
| ap = argparse.ArgumentParser("python pyinstaller.py") | |
| ap.add_argument("wheel_file", help="Path to a .whl file to install") | |
| ap.add_argument( | |
| "--interpreter", required=True, help="Interpreter path to be used in scripts" | |
| ) | |
| ap.add_argument( | |
| "--script-kind", | |
| required=True, | |
| choices=["posix", "win-ia32", "win-amd64", "win-arm", "win-arm64"], | |
| help="Kind of launcher to create for each script", | |
| ) | |
| dest_args = ap.add_argument_group("Destination directories") | |
| dest_args.add_argument( | |
| "--purelib", | |
| required=True, | |
| help="Directory for platform-independent Python modules", | |
| ) | |
| dest_args.add_argument( | |
| "--platlib", | |
| help="Directory for platform-dependent Python modules (same as purelib " | |
| "if not specified)", | |
| ) | |
| dest_args.add_argument( | |
| "--headers", required=True, help="Directory for C header files" | |
| ) | |
| dest_args.add_argument( | |
| "--scripts", required=True, help="Directory for executable scripts" | |
| ) | |
| dest_args.add_argument( | |
| "--data", required=True, help="Directory for external data files" | |
| ) | |
| args = ap.parse_args() | |
| destination = SchemeDictionaryDestination( | |
| { | |
| "purelib": args.purelib, | |
| "platlib": args.platlib if args.platlib is not None else args.purelib, | |
| "headers": args.headers, | |
| "scripts": args.scripts, | |
| "data": args.data, | |
| }, | |
| interpreter=args.interpreter, | |
| script_kind=args.script_kind, | |
| ) | |
| with WheelFile.open(glob.glob(args.wheel_file)[0]) as source: | |
| clean(source, destination) | |
| install( | |
| source=source, | |
| destination=destination, | |
| additional_metadata={}, | |
| ) | |
| if __name__ == "__main__": | |
| main() |