"""Mypyc command-line tool. Usage: $ mypyc foo.py [...] $ python3 -c 'import foo' # Uses compiled 'foo' This is just a thin wrapper that generates a setup.py file that uses mypycify, suitable for prototyping and testing. """ from __future__ import annotations import os import os.path import subprocess import sys base_path = os.path.join(os.path.dirname(__file__), "..") setup_format = """\ from setuptools import setup from mypyc.build import mypycify setup(name='mypyc_output', ext_modules=mypycify({}, opt_level="{}", debug_level="{}"), ) """ def main() -> None: build_dir = "build" # can this be overridden?? try: os.mkdir(build_dir) except FileExistsError: pass opt_level = os.getenv("MYPYC_OPT_LEVEL", "3") debug_level = os.getenv("MYPYC_DEBUG_LEVEL", "1") setup_file = os.path.join(build_dir, "setup.py") with open(setup_file, "w") as f: f.write(setup_format.format(sys.argv[1:], opt_level, debug_level)) # We don't use run_setup (like we do in the test suite) because it throws # away the error code from distutils, and we don't care about the slight # performance loss here. env = os.environ.copy() base_path = os.path.join(os.path.dirname(__file__), "..") env["PYTHONPATH"] = base_path + os.pathsep + env.get("PYTHONPATH", "") cmd = subprocess.run([sys.executable, setup_file, "build_ext", "--inplace"], env=env) sys.exit(cmd.returncode) if __name__ == "__main__": main()