xref: /llvm-project/mlir/test/get_darwin_real_python.py (revision beff2bacae76fe25c86c5bf7bccb2cbef93de047)
1*beff2bacSKasper Nielsen# On macOS, system python binaries like /usr/bin/python and $(xcrun -f python3)
2*beff2bacSKasper Nielsen# are shims. They do some light validation work and then spawn the "real" python
3*beff2bacSKasper Nielsen# binary. Find the "real" python by asking dyld -- sys.executable reports the
4*beff2bacSKasper Nielsen# wrong thing more often than not. This is also useful when we're running under
5*beff2bacSKasper Nielsen# a Homebrew python3 binary, which also appears to be some kind of shim.
6*beff2bacSKasper Nielsendef getDarwinRealPythonExecutable():
7*beff2bacSKasper Nielsen    import ctypes
8*beff2bacSKasper Nielsen
9*beff2bacSKasper Nielsen    dyld = ctypes.cdll.LoadLibrary("/usr/lib/system/libdyld.dylib")
10*beff2bacSKasper Nielsen    namelen = ctypes.c_ulong(1024)
11*beff2bacSKasper Nielsen    name = ctypes.create_string_buffer(b"\000", namelen.value)
12*beff2bacSKasper Nielsen    dyld._NSGetExecutablePath(ctypes.byref(name), ctypes.byref(namelen))
13*beff2bacSKasper Nielsen    return name.value.decode("utf-8").strip()
14*beff2bacSKasper Nielsen
15*beff2bacSKasper Nielsen
16*beff2bacSKasper Nielsenprint(getDarwinRealPythonExecutable())
17