"""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="{}", strict_dunder_typing={}, log_trace={}, ), ) """ 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") strict_dunder_typing = bool(int(os.getenv("MYPYC_STRICT_DUNDER_TYPING", "0"))) # If enabled, compiled code writes a sampled log of executed ops (or events) to # mypyc_trace.txt. log_trace = bool(int(os.getenv("MYPYC_LOG_TRACE", "0"))) 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, strict_dunder_typing, log_trace ) ) # 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()