Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can not link to virtual environment on OS X #1741

Open
anthonyjchriste opened this issue Jul 27, 2021 · 14 comments
Open

Can not link to virtual environment on OS X #1741

anthonyjchriste opened this issue Jul 27, 2021 · 14 comments

Comments

@anthonyjchriste
Copy link

anthonyjchriste commented Jul 27, 2021

🐛 Bug Reports

I can not link to the correct virtual environment in OS X. Instead, the system Python is always used.

🌍 Environment

  • Your operating system and version: OS X Big Sur 11.5
  • Your python version: 3.8.11
  • How did you install python (e.g. apt or pyenv)? Did you use a virtualenv?: Python was installed with homebrew via brew install python@3.8 A virtual environment was created with python3 -m venv redvox and is located at /Users/anthony/venvs/redvox
  • Your Rust version (rustc --version): rustc 1.56.0-nightly (9c25eb7aa 2021-07-25)
  • Your PyO3 version: 14.1
  • Have you tried using latest PyO3 main (replace version = "0.x.y" with git = "https://github.com/PyO3/pyo3")?:

No

💥 Reproducing

  1. Activate the virtual environment source /Users/anthony/venvs/redvox/bin/activate
  2. Ensure matplotlib is installed pip install matplotlib
  3. Run the rust code cargo run
use pyo3::prelude::*;
use std::io::Result;

fn main() -> Result<()> {
    let src = r#"
import sys
print(sys.executable, sys.path)
import matplotlib
            "#;

    Python::with_gil(|py| {
        py.run(src, None, None).unwrap();
    });

    Ok(())
}

The following shows how I activate the virtual environment and attempt to call the rust code. The error message I receive is also included.

anthony@REDVOX-00-MACBOOK-PRO rust-sandbox % source ~/venvs/redvox/bin/activate
(redvox) anthony@REDVOX-00-MACBOOK-PRO rust-sandbox % python3
Python 3.8.11 (default, Jun 29 2021, 03:08:07) 
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> exit()
(redvox) anthony@REDVOX-00-MACBOOK-PRO rust-sandbox % cargo run 
   Compiling pyo3 v0.14.1
   Compiling rust-sandbox v0.1.0 (/Users/anthony/Development/rust-sandbox)
    Finished dev [unoptimized + debuginfo] target(s) in 4.63s
     Running `target/debug/rust-sandbox`
/Users/anthony/Development/rust-sandbox/target/debug/rust-sandbox ['/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: PyErr { type: <class 'ModuleNotFoundError'>, value: ModuleNotFoundError("No module named 'matplotlib'"), traceback: Some(<traceback object at 0x100ddbbc0>) }', src/main.rs:12:33
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

I've tried setting PYTHONHOME and PYTHONPATH. Neither of these have worked for me. The system Python is always used no matter what I try. How can I get pyo3 to work with my virtual environment on OS X?

@davidhewitt
Copy link
Member

Hmmm, let's try to figure this out.

First, can you please run and share here the output from the print-config binary in the pyo3-build-config crate, to verify that PyO3 is linking against your virtualenv correctly?

$ git clone https://github.com/PyO3/pyo3
$ cd pyo3/pyo3-build-config
$ cargo run --bin print-config

@anthonyjchriste
Copy link
Author

anthonyjchriste commented Jul 28, 2021

Thanks for the response and thank you for letting me know about this tool!

I ran the print-config command twice. The first time outside of my virtual environment and the second time from within my virtual environment.

Outside virtual environment

anthony@REDVOX-00-MBP pyo3-build-config % cargo run --bin print-config
warning: profiles for the non root package will be ignored, specify profiles at the workspace root:
package:   /Users/anthony/scrap/pyo3/examples/pyo3-pytests/Cargo.toml
workspace: /Users/anthony/scrap/pyo3/Cargo.toml
    Updating crates.io index
  Downloaded once_cell v1.8.0
  Downloaded 1 crate (28.9 KB) in 3.14s
   Compiling pyo3-build-config v0.14.1 (/Users/anthony/scrap/pyo3/pyo3-build-config)
   Compiling once_cell v1.8.0
    Finished dev [unoptimized + debuginfo] target(s) in 9.38s
     Running `/Users/anthony/scrap/pyo3/target/debug/print-config`
cargo:rerun-if-env-changed=PYO3_PYTHON
cargo:rerun-if-env-changed=VIRTUAL_ENV
cargo:rerun-if-env-changed=CONDA_PREFIX
cargo:rerun-if-env-changed=PATH
implementation: CPython
interpreter version: 3.8
interpreter path: Some("/usr/local/opt/python@3.8/bin/python3.8")
libdir: Some("/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib")
shared: true
base prefix: Some("/usr/local/Cellar/python@3.8/3.8.11/Frameworks/Python.framework/Versions/3.8")
ld_version: Some("3.8")
pointer width: Some(8)

Inside virtual environment

anthony@REDVOX-00-MBP pyo3-build-config % source ~/venvs/redvox/bin/activate
(redvox) anthony@REDVOX-00-MBP pyo3-build-config % cargo run --bin print-config
warning: profiles for the non root package will be ignored, specify profiles at the workspace root:
package:   /Users/anthony/scrap/pyo3/examples/pyo3-pytests/Cargo.toml
workspace: /Users/anthony/scrap/pyo3/Cargo.toml
   Compiling pyo3-build-config v0.14.1 (/Users/anthony/scrap/pyo3/pyo3-build-config)
   Compiling once_cell v1.8.0
    Finished dev [unoptimized + debuginfo] target(s) in 2.12s
     Running `/Users/anthony/scrap/pyo3/target/debug/print-config`
cargo:rerun-if-env-changed=PYO3_PYTHON
cargo:rerun-if-env-changed=VIRTUAL_ENV
cargo:rerun-if-env-changed=CONDA_PREFIX
implementation: CPython
interpreter version: 3.8
interpreter path: Some("/Users/anthony/venvs/redvox/bin/python")
libdir: Some("/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib")
shared: true
base prefix: Some("/usr/local/Cellar/python@3.8/3.8.11/Frameworks/Python.framework/Versions/3.8")
ld_version: Some("3.8")
pointer width: Some(8)

It appears that the virtual environment is using the correct Python interpreter, but it still won't load any of my pip dependencies. Might this be because the libdir is not being updated?

P.S. This is an amazing project and I'm really grateful for all of the hard work from yourself and other contributors. I would be interested in becoming involved with this project in the future.

@davidhewitt
Copy link
Member

It appears that the virtual environment is using the correct Python interpreter, but it still won't load any of my pip dependencies. Might this be because the libdir is not being updated?

Hmm. As far as I know PYTHONPATH and PYTHONHOME should work. When / how are you setting them? On unix I don't recall having ever needed to set these though.

cc @messense - If I remember you have a Mac, perhaps you have some experience in this area?

P.S. This is an amazing project and I'm really grateful for all of the hard work from yourself and other contributors. I would be interested in becoming involved with this project in the future.

Awesome, really glad to hear it! I think we're a friendly bunch and everyone is welcome to help out. All of the design ideas are floating around in Github issues, so feel free to take on anything that takes your fancy. Or propose new ideas, etc. 👍

@messense
Copy link
Member

Never tried running pyo3 code directly in virtualenv before. Here is a sysconfig dump of a venv in macOS

Platform: "macosx-11.2-arm64"
Python version: "3.9"
Current installation scheme: "posix_prefix"

Paths:
	data = "/Users/messense/.pyenv/versions/test"
	include = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9"
	platinclude = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9"
	platlib = "/Users/messense/.pyenv/versions/test/lib/python3.9/site-packages"
	platstdlib = "/Users/messense/.pyenv/versions/test/lib/python3.9"
	purelib = "/Users/messense/.pyenv/versions/test/lib/python3.9/site-packages"
	scripts = "/Users/messense/.pyenv/versions/test/bin"
	stdlib = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9"

Variables:
	ABIFLAGS = ""
	AC_APPLE_UNIVERSAL_BUILD = "0"
	AIX_BUILDDATE = "0"
	AIX_GENUINE_CPLUSPLUS = "0"
	ALT_SOABI = "0"
	ANDROID_API_LEVEL = "0"
	AR = "ar"
	ARFLAGS = "rcs"
	BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code"
	BASECPPFLAGS = ""
	BASEMODLIBS = ""
	BINDIR = "/Users/messense/.pyenv/versions/3.9.2/bin"
	BINLIBDEST = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9"
	BLDLIBRARY = "-L. -lpython3.9"
	BLDSHARED = "clang -bundle -undefined dynamic_lookup -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"
	BUILDEXE = ".exe"
	BUILDPYTHON = "python.exe"
	BUILD_GNU_TYPE = "arm-apple-darwin20.3.0"
	BYTESTR_DEPS = "\"
	CC = "clang"
	CCSHARED = ""
	CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"
	CFLAGSFORSHARED = ""
	CFLAGS_ALIASING = "-fno-strict-aliasing"
	CFLAGS_NODIST = ""
	CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in"
	CONFIGURE_CFLAGS = "-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"
	CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden"
	CONFIGURE_CPPFLAGS = "-I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include"
	CONFIGURE_LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"
	CONFIGURE_LDFLAGS_NODIST = ""
	CONFIG_ARGS = "'--prefix=/Users/messense/.pyenv/versions/3.9.2' '--enable-shared' '--libdir=/Users/messense/.pyenv/versions/3.9.2/lib' '--with-openssl=/opt/homebrew/opt/openssl@1.1' 'CC=clang' 'CFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include  ' 'LDFLAGS=-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib' 'CPPFLAGS=-I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include ' 'PKG_CONFIG_PATH=/opt/homebrew/opt/openssl@1.1/lib/pkgconfig/:'"
	CONFINCLUDEDIR = "/Users/messense/.pyenv/versions/3.9.2/include"
	CONFINCLUDEPY = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9"
	COREPYTHONPATH = ""
	COVERAGE_INFO = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2/coverage.info"
	COVERAGE_REPORT = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2/lcov-report"
	COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report""
	CPPFLAGS = "-I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include"
	CXX = "clang++"
	DESTDIRS = "/Users/messense/.pyenv/versions/3.9.2 /Users/messense/.pyenv/versions/3.9.2/lib /Users/messense/.pyenv/versions/3.9.2/lib/python3.9 /Users/messense/.pyenv/versions/3.9.2/lib/python3.9/lib-dynload"
	DESTLIB = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9"
	DESTPATH = ""
	DESTSHARED = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9/lib-dynload"
	DFLAGS = ""
	DIRMODE = "755"
	DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy"
	DISTDIRS = "Include Lib Misc Ext-dummy"
	DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in"
	DLINCLDIR = "."
	DLLLIBRARY = ""
	DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0"
	DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0"
	DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1"
	DTRACE = ""
	DTRACE_DEPS = "\"
	DTRACE_HEADERS = ""
	DTRACE_OBJS = ""
	DYNLOADFILE = "dynload_shlib.o"
	ENABLE_IPV6 = "1"
	ENSUREPIP = "upgrade"
	EXE = ""
	EXEMODE = "755"
	EXPORTSFROM = ""
	EXPORTSYMS = ""
	EXTRATESTOPTS = ""
	EXTRA_CFLAGS = ""
	EXT_SUFFIX = ".cpython-39-darwin.so"
	FILEMODE = "644"
	FLOAT_WORDS_BIGENDIAN = "0"
	FLOCK_NEEDS_LIBBSD = "0"
	GETPGRP_HAVE_ARG = "0"
	GITBRANCH = ""
	GITTAG = ""
	GITVERSION = ""
	GNULD = "no"
	HAVE_ACCEPT4 = "0"
	HAVE_ACOSH = "1"
	HAVE_ADDRINFO = "1"
	HAVE_ALARM = "1"
	HAVE_ALIGNED_REQUIRED = "0"
	HAVE_ALLOCA_H = "1"
	HAVE_ALTZONE = "0"
	HAVE_ASINH = "1"
	HAVE_ASM_TYPES_H = "0"
	HAVE_ATANH = "1"
	HAVE_BIND_TEXTDOMAIN_CODESET = "0"
	HAVE_BLUETOOTH_BLUETOOTH_H = "0"
	HAVE_BLUETOOTH_H = "0"
	HAVE_BROKEN_MBSTOWCS = "0"
	HAVE_BROKEN_NICE = "0"
	HAVE_BROKEN_PIPE_BUF = "0"
	HAVE_BROKEN_POLL = "0"
	HAVE_BROKEN_POSIX_SEMAPHORES = "0"
	HAVE_BROKEN_PTHREAD_SIGMASK = "0"
	HAVE_BROKEN_SEM_GETVALUE = "1"
	HAVE_BROKEN_UNSETENV = "0"
	HAVE_BUILTIN_ATOMIC = "1"
	HAVE_CHFLAGS = "1"
	HAVE_CHOWN = "1"
	HAVE_CHROOT = "1"
	HAVE_CLOCK = "1"
	HAVE_CLOCK_GETRES = "1"
	HAVE_CLOCK_GETTIME = "1"
	HAVE_CLOCK_SETTIME = "1"
	HAVE_COMPUTED_GOTOS = "1"
	HAVE_CONFSTR = "1"
	HAVE_CONIO_H = "0"
	HAVE_COPYSIGN = "1"
	HAVE_COPY_FILE_RANGE = "0"
	HAVE_CRYPT_H = "0"
	HAVE_CRYPT_R = "0"
	HAVE_CTERMID = "1"
	HAVE_CTERMID_R = "1"
	HAVE_CURSES_FILTER = "1"
	HAVE_CURSES_H = "1"
	HAVE_CURSES_HAS_KEY = "1"
	HAVE_CURSES_IMMEDOK = "1"
	HAVE_CURSES_IS_PAD = "0"
	HAVE_CURSES_IS_TERM_RESIZED = "1"
	HAVE_CURSES_RESIZETERM = "1"
	HAVE_CURSES_RESIZE_TERM = "1"
	HAVE_CURSES_SYNCOK = "1"
	HAVE_CURSES_TYPEAHEAD = "1"
	HAVE_CURSES_USE_ENV = "1"
	HAVE_CURSES_WCHGAT = "1"
	HAVE_DECL_ISFINITE = "1"
	HAVE_DECL_ISINF = "1"
	HAVE_DECL_ISNAN = "1"
	HAVE_DECL_RTLD_DEEPBIND = "0"
	HAVE_DECL_RTLD_GLOBAL = "1"
	HAVE_DECL_RTLD_LAZY = "1"
	HAVE_DECL_RTLD_LOCAL = "1"
	HAVE_DECL_RTLD_MEMBER = "0"
	HAVE_DECL_RTLD_NODELETE = "1"
	HAVE_DECL_RTLD_NOLOAD = "1"
	HAVE_DECL_RTLD_NOW = "1"
	HAVE_DECL_TZNAME = "0"
	HAVE_DEVICE_MACROS = "1"
	HAVE_DEV_PTC = "0"
	HAVE_DEV_PTMX = "1"
	HAVE_DIRECT_H = "0"
	HAVE_DIRENT_D_TYPE = "1"
	HAVE_DIRENT_H = "1"
	HAVE_DIRFD = "1"
	HAVE_DLFCN_H = "1"
	HAVE_DLOPEN = "1"
	HAVE_DUP2 = "1"
	HAVE_DUP3 = "0"
	HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "1"
	HAVE_DYNAMIC_LOADING = "1"
	HAVE_ENDIAN_H = "0"
	HAVE_EPOLL = "0"
	HAVE_EPOLL_CREATE1 = "0"
	HAVE_ERF = "1"
	HAVE_ERFC = "1"
	HAVE_ERRNO_H = "1"
	HAVE_EXECV = "1"
	HAVE_EXPLICIT_BZERO = "0"
	HAVE_EXPLICIT_MEMSET = "0"
	HAVE_EXPM1 = "1"
	HAVE_FACCESSAT = "1"
	HAVE_FCHDIR = "1"
	HAVE_FCHMOD = "1"
	HAVE_FCHMODAT = "1"
	HAVE_FCHOWN = "1"
	HAVE_FCHOWNAT = "1"
	HAVE_FCNTL_H = "1"
	HAVE_FDATASYNC = "0"
	HAVE_FDOPENDIR = "1"
	HAVE_FDWALK = "0"
	HAVE_FEXECVE = "0"
	HAVE_FINITE = "0"
	HAVE_FLOCK = "1"
	HAVE_FORK = "1"
	HAVE_FORKPTY = "1"
	HAVE_FPATHCONF = "1"
	HAVE_FSEEK64 = "0"
	HAVE_FSEEKO = "1"
	HAVE_FSTATAT = "1"
	HAVE_FSTATVFS = "1"
	HAVE_FSYNC = "1"
	HAVE_FTELL64 = "0"
	HAVE_FTELLO = "1"
	HAVE_FTIME = "1"
	HAVE_FTRUNCATE = "1"
	HAVE_FUTIMENS = "1"
	HAVE_FUTIMES = "1"
	HAVE_FUTIMESAT = "0"
	HAVE_GAI_STRERROR = "1"
	HAVE_GAMMA = "0"
	HAVE_GCC_ASM_FOR_MC68881 = "0"
	HAVE_GCC_ASM_FOR_X64 = "0"
	HAVE_GCC_ASM_FOR_X87 = "0"
	HAVE_GCC_UINT128_T = "1"
	HAVE_GETADDRINFO = "1"
	HAVE_GETC_UNLOCKED = "1"
	HAVE_GETENTROPY = "1"
	HAVE_GETGRGID_R = "1"
	HAVE_GETGRNAM_R = "1"
	HAVE_GETGROUPLIST = "1"
	HAVE_GETGROUPS = "1"
	HAVE_GETHOSTBYNAME = "1"
	HAVE_GETHOSTBYNAME_R = "0"
	HAVE_GETHOSTBYNAME_R_3_ARG = "0"
	HAVE_GETHOSTBYNAME_R_5_ARG = "0"
	HAVE_GETHOSTBYNAME_R_6_ARG = "0"
	HAVE_GETITIMER = "1"
	HAVE_GETLOADAVG = "1"
	HAVE_GETLOGIN = "1"
	HAVE_GETNAMEINFO = "1"
	HAVE_GETPAGESIZE = "1"
	HAVE_GETPEERNAME = "1"
	HAVE_GETPGID = "1"
	HAVE_GETPGRP = "1"
	HAVE_GETPID = "1"
	HAVE_GETPRIORITY = "1"
	HAVE_GETPWENT = "1"
	HAVE_GETPWNAM_R = "1"
	HAVE_GETPWUID_R = "1"
	HAVE_GETRANDOM = "0"
	HAVE_GETRANDOM_SYSCALL = "0"
	HAVE_GETRESGID = "0"
	HAVE_GETRESUID = "0"
	HAVE_GETSID = "1"
	HAVE_GETSPENT = "0"
	HAVE_GETSPNAM = "0"
	HAVE_GETWD = "1"
	HAVE_GLIBC_MEMMOVE_BUG = "0"
	HAVE_GRP_H = "1"
	HAVE_HSTRERROR = "1"
	HAVE_HTOLE64 = "0"
	HAVE_HYPOT = "1"
	HAVE_IEEEFP_H = "0"
	HAVE_IF_NAMEINDEX = "1"
	HAVE_INET_ATON = "1"
	HAVE_INET_PTON = "1"
	HAVE_INITGROUPS = "1"
	HAVE_INTTYPES_H = "1"
	HAVE_IO_H = "0"
	HAVE_IPA_PURE_CONST_BUG = "0"
	HAVE_KILL = "1"
	HAVE_KILLPG = "1"
	HAVE_KQUEUE = "1"
	HAVE_LANGINFO_H = "1"
	HAVE_LARGEFILE_SUPPORT = "0"
	HAVE_LCHFLAGS = "1"
	HAVE_LCHMOD = "1"
	HAVE_LCHOWN = "1"
	HAVE_LGAMMA = "1"
	HAVE_LIBDL = "1"
	HAVE_LIBDLD = "0"
	HAVE_LIBIEEE = "0"
	HAVE_LIBINTL_H = "0"
	HAVE_LIBREADLINE = "1"
	HAVE_LIBRESOLV = "0"
	HAVE_LIBSENDFILE = "0"
	HAVE_LIBUTIL_H = "0"
	HAVE_LINK = "1"
	HAVE_LINKAT = "1"
	HAVE_LINUX_CAN_BCM_H = "0"
	HAVE_LINUX_CAN_H = "0"
	HAVE_LINUX_CAN_J1939_H = "0"
	HAVE_LINUX_CAN_RAW_FD_FRAMES = "0"
	HAVE_LINUX_CAN_RAW_H = "0"
	HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0"
	HAVE_LINUX_MEMFD_H = "0"
	HAVE_LINUX_NETLINK_H = "0"
	HAVE_LINUX_QRTR_H = "0"
	HAVE_LINUX_RANDOM_H = "0"
	HAVE_LINUX_TIPC_H = "0"
	HAVE_LINUX_VM_SOCKETS_H = "0"
	HAVE_LINUX_WAIT_H = "0"
	HAVE_LOCKF = "1"
	HAVE_LOG1P = "1"
	HAVE_LOG2 = "1"
	HAVE_LONG_DOUBLE = "1"
	HAVE_LSTAT = "1"
	HAVE_LUTIMES = "1"
	HAVE_MADVISE = "1"
	HAVE_MAKEDEV = "1"
	HAVE_MBRTOWC = "1"
	HAVE_MEMFD_CREATE = "0"
	HAVE_MEMORY_H = "1"
	HAVE_MEMRCHR = "0"
	HAVE_MKDIRAT = "1"
	HAVE_MKFIFO = "1"
	HAVE_MKFIFOAT = "0"
	HAVE_MKNOD = "1"
	HAVE_MKNODAT = "0"
	HAVE_MKTIME = "1"
	HAVE_MMAP = "1"
	HAVE_MREMAP = "0"
	HAVE_NCURSES_H = "1"
	HAVE_NDIR_H = "0"
	HAVE_NETPACKET_PACKET_H = "0"
	HAVE_NET_IF_H = "1"
	HAVE_NICE = "1"
	HAVE_OPENAT = "1"
	HAVE_OPENPTY = "1"
	HAVE_PATHCONF = "1"
	HAVE_PAUSE = "1"
	HAVE_PIPE2 = "0"
	HAVE_PLOCK = "0"
	HAVE_POLL = "1"
	HAVE_POLL_H = "1"
	HAVE_POSIX_FADVISE = "0"
	HAVE_POSIX_FALLOCATE = "0"
	HAVE_POSIX_SPAWN = "1"
	HAVE_POSIX_SPAWNP = "1"
	HAVE_PREAD = "1"
	HAVE_PREADV = "1"
	HAVE_PREADV2 = "0"
	HAVE_PRLIMIT = "0"
	HAVE_PROCESS_H = "0"
	HAVE_PROTOTYPES = "1"
	HAVE_PTHREAD_CONDATTR_SETCLOCK = "0"
	HAVE_PTHREAD_DESTRUCTOR = "0"
	HAVE_PTHREAD_GETCPUCLOCKID = "0"
	HAVE_PTHREAD_H = "1"
	HAVE_PTHREAD_INIT = "0"
	HAVE_PTHREAD_KILL = "1"
	HAVE_PTHREAD_SIGMASK = "1"
	HAVE_PTY_H = "0"
	HAVE_PWRITE = "1"
	HAVE_PWRITEV = "1"
	HAVE_PWRITEV2 = "0"
	HAVE_READLINK = "1"
	HAVE_READLINKAT = "1"
	HAVE_READV = "1"
	HAVE_REALPATH = "1"
	HAVE_RENAMEAT = "1"
	HAVE_RL_APPEND_HISTORY = "1"
	HAVE_RL_CATCH_SIGNAL = "1"
	HAVE_RL_COMPLETION_APPEND_CHARACTER = "1"
	HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1"
	HAVE_RL_COMPLETION_MATCHES = "1"
	HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1"
	HAVE_RL_PRE_INPUT_HOOK = "1"
	HAVE_RL_RESIZE_TERMINAL = "1"
	HAVE_ROUND = "1"
	HAVE_RTPSPAWN = "0"
	HAVE_SCHED_GET_PRIORITY_MAX = "1"
	HAVE_SCHED_H = "1"
	HAVE_SCHED_RR_GET_INTERVAL = "0"
	HAVE_SCHED_SETAFFINITY = "0"
	HAVE_SCHED_SETPARAM = "0"
	HAVE_SCHED_SETSCHEDULER = "0"
	HAVE_SEM_GETVALUE = "1"
	HAVE_SEM_OPEN = "1"
	HAVE_SEM_TIMEDWAIT = "0"
	HAVE_SEM_UNLINK = "1"
	HAVE_SENDFILE = "1"
	HAVE_SETEGID = "1"
	HAVE_SETEUID = "1"
	HAVE_SETGID = "1"
	HAVE_SETGROUPS = "1"
	HAVE_SETHOSTNAME = "1"
	HAVE_SETITIMER = "1"
	HAVE_SETLOCALE = "1"
	HAVE_SETPGID = "1"
	HAVE_SETPGRP = "1"
	HAVE_SETPRIORITY = "1"
	HAVE_SETREGID = "1"
	HAVE_SETRESGID = "0"
	HAVE_SETRESUID = "0"
	HAVE_SETREUID = "1"
	HAVE_SETSID = "1"
	HAVE_SETUID = "1"
	HAVE_SETVBUF = "1"
	HAVE_SHADOW_H = "0"
	HAVE_SHM_OPEN = "1"
	HAVE_SHM_UNLINK = "1"
	HAVE_SIGACTION = "1"
	HAVE_SIGALTSTACK = "1"
	HAVE_SIGFILLSET = "1"
	HAVE_SIGINFO_T_SI_BAND = "1"
	HAVE_SIGINTERRUPT = "1"
	HAVE_SIGNAL_H = "1"
	HAVE_SIGPENDING = "1"
	HAVE_SIGRELSE = "1"
	HAVE_SIGTIMEDWAIT = "0"
	HAVE_SIGWAIT = "1"
	HAVE_SIGWAITINFO = "0"
	HAVE_SNPRINTF = "1"
	HAVE_SOCKADDR_ALG = "0"
	HAVE_SOCKADDR_SA_LEN = "1"
	HAVE_SOCKADDR_STORAGE = "1"
	HAVE_SOCKETPAIR = "1"
	HAVE_SPAWN_H = "1"
	HAVE_SSIZE_T = "1"
	HAVE_STATVFS = "1"
	HAVE_STAT_TV_NSEC = "0"
	HAVE_STAT_TV_NSEC2 = "1"
	HAVE_STDARG_PROTOTYPES = "1"
	HAVE_STDINT_H = "1"
	HAVE_STDLIB_H = "1"
	HAVE_STD_ATOMIC = "1"
	HAVE_STRDUP = "1"
	HAVE_STRFTIME = "1"
	HAVE_STRINGS_H = "1"
	HAVE_STRING_H = "1"
	HAVE_STRLCPY = "1"
	HAVE_STROPTS_H = "0"
	HAVE_STRSIGNAL = "1"
	HAVE_STRUCT_PASSWD_PW_GECOS = "1"
	HAVE_STRUCT_PASSWD_PW_PASSWD = "1"
	HAVE_STRUCT_STAT_ST_BIRTHTIME = "1"
	HAVE_STRUCT_STAT_ST_BLKSIZE = "1"
	HAVE_STRUCT_STAT_ST_BLOCKS = "1"
	HAVE_STRUCT_STAT_ST_FLAGS = "1"
	HAVE_STRUCT_STAT_ST_GEN = "1"
	HAVE_STRUCT_STAT_ST_RDEV = "1"
	HAVE_STRUCT_TM_TM_ZONE = "1"
	HAVE_SYMLINK = "1"
	HAVE_SYMLINKAT = "1"
	HAVE_SYNC = "1"
	HAVE_SYSCONF = "1"
	HAVE_SYSEXITS_H = "1"
	HAVE_SYS_AUDIOIO_H = "0"
	HAVE_SYS_BSDTTY_H = "0"
	HAVE_SYS_DEVPOLL_H = "0"
	HAVE_SYS_DIR_H = "0"
	HAVE_SYS_ENDIAN_H = "0"
	HAVE_SYS_EPOLL_H = "0"
	HAVE_SYS_EVENT_H = "1"
	HAVE_SYS_FILE_H = "1"
	HAVE_SYS_IOCTL_H = "1"
	HAVE_SYS_KERN_CONTROL_H = "1"
	HAVE_SYS_LOADAVG_H = "0"
	HAVE_SYS_LOCK_H = "1"
	HAVE_SYS_MEMFD_H = "0"
	HAVE_SYS_MKDEV_H = "0"
	HAVE_SYS_MMAN_H = "1"
	HAVE_SYS_MODEM_H = "0"
	HAVE_SYS_NDIR_H = "0"
	HAVE_SYS_PARAM_H = "1"
	HAVE_SYS_POLL_H = "1"
	HAVE_SYS_RANDOM_H = "1"
	HAVE_SYS_RESOURCE_H = "1"
	HAVE_SYS_SELECT_H = "1"
	HAVE_SYS_SENDFILE_H = "0"
	HAVE_SYS_SOCKET_H = "1"
	HAVE_SYS_STATVFS_H = "1"
	HAVE_SYS_STAT_H = "1"
	HAVE_SYS_SYSCALL_H = "1"
	HAVE_SYS_SYSMACROS_H = "0"
	HAVE_SYS_SYS_DOMAIN_H = "1"
	HAVE_SYS_TERMIO_H = "0"
	HAVE_SYS_TIMES_H = "1"
	HAVE_SYS_TIME_H = "1"
	HAVE_SYS_TYPES_H = "1"
	HAVE_SYS_UIO_H = "1"
	HAVE_SYS_UN_H = "1"
	HAVE_SYS_UTSNAME_H = "1"
	HAVE_SYS_WAIT_H = "1"
	HAVE_SYS_XATTR_H = "1"
	HAVE_TCGETPGRP = "1"
	HAVE_TCSETPGRP = "1"
	HAVE_TEMPNAM = "1"
	HAVE_TERMIOS_H = "1"
	HAVE_TERM_H = "1"
	HAVE_TGAMMA = "1"
	HAVE_TIMEGM = "1"
	HAVE_TIMES = "1"
	HAVE_TMPFILE = "1"
	HAVE_TMPNAM = "1"
	HAVE_TMPNAM_R = "0"
	HAVE_TM_ZONE = "1"
	HAVE_TRUNCATE = "1"
	HAVE_TZNAME = "0"
	HAVE_UCS4_TCL = "0"
	HAVE_UNAME = "1"
	HAVE_UNISTD_H = "1"
	HAVE_UNLINKAT = "1"
	HAVE_USABLE_WCHAR_T = "0"
	HAVE_UTIL_H = "1"
	HAVE_UTIMENSAT = "1"
	HAVE_UTIMES = "1"
	HAVE_UTIME_H = "1"
	HAVE_UUID_CREATE = "0"
	HAVE_UUID_ENC_BE = "0"
	HAVE_UUID_GENERATE_TIME_SAFE = "0"
	HAVE_UUID_H = "0"
	HAVE_UUID_UUID_H = "1"
	HAVE_WAIT3 = "1"
	HAVE_WAIT4 = "1"
	HAVE_WAITID = "1"
	HAVE_WAITPID = "1"
	HAVE_WCHAR_H = "1"
	HAVE_WCSCOLL = "1"
	HAVE_WCSFTIME = "1"
	HAVE_WCSXFRM = "1"
	HAVE_WMEMCMP = "1"
	HAVE_WORKING_TZSET = "1"
	HAVE_WRITEV = "1"
	HAVE_X509_VERIFY_PARAM_SET1_HOST = "1"
	HAVE_ZLIB_COPY = "1"
	HAVE__GETPTY = "0"
	HOST_GNU_TYPE = "arm-apple-darwin20.3.0"
	INCLDIRSTOMAKE = "/Users/messense/.pyenv/versions/3.9.2/include /Users/messense/.pyenv/versions/3.9.2/include /Users/messense/.pyenv/versions/3.9.2/include/python3.9 /Users/messense/.pyenv/versions/3.9.2/include/python3.9"
	INCLUDEDIR = "/Users/messense/.pyenv/versions/3.9.2/include"
	INCLUDEPY = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9"
	INSTALL = "/usr/bin/install -c"
	INSTALL_DATA = "/usr/bin/install -c -m 644"
	INSTALL_PROGRAM = "/usr/bin/install -c"
	INSTALL_SCRIPT = "/usr/bin/install -c"
	INSTALL_SHARED = "/usr/bin/install -c -m 755"
	INSTSONAME = "libpython3.9.dylib"
	IO_H = "Modules/_io/_iomodule.h"
	IO_OBJS = "\"
	LDCXXSHARED = "clang++ -bundle -undefined dynamic_lookup"
	LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"
	LDFLAGS_NODIST = ""
	LDLIBRARY = "libpython3.9.dylib"
	LDLIBRARYDIR = ""
	LDSHARED = "clang -bundle -undefined dynamic_lookup -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"
	LDVERSION = "3.9"
	LIBC = ""
	LIBDEST = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9"
	LIBDIR = "/Users/messense/.pyenv/versions/3.9.2/lib"
	LIBFFI_INCLUDEDIR = ""
	LIBM = ""
	LIBOBJDIR = "Python/"
	LIBOBJS = ""
	LIBPC = "/Users/messense/.pyenv/versions/3.9.2/lib/pkgconfig"
	LIBPL = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9/config-3.9-darwin"
	LIBPYTHON = ""
	LIBRARY = "libpython3.9.a"
	LIBRARY_OBJS = "\"
	LIBRARY_OBJS_OMIT_FROZEN = "\"
	LIBS = "-ldl   -framework CoreFoundation"
	LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \"
	LINKCC = "clang"
	LINKFORSHARED = "-Wl,-stack_size,1000000  -framework CoreFoundation"
	LIPO_32BIT_FLAGS = ""
	LLVM_PROF_ERR = "no"
	LLVM_PROF_FILE = "LLVM_PROFILE_FILE="code-%p.profclangr""
	LLVM_PROF_MERGER = "/usr/bin/xcrun llvm-profdata merge -output=code.profclangd *.profclangr"
	LN = "ln"
	LOCALMODLIBS = ""
	MACHDEP = "darwin"
	MACHDEP_OBJS = ""
	MACHDESTLIB = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9"
	MACOSX_DEPLOYMENT_TARGET = "11.2"
	MAINCC = "clang"
	MAJOR_IN_MKDEV = "0"
	MAJOR_IN_SYSMACROS = "0"
	MAKESETUP = "./Modules/makesetup"
	MANDIR = "/Users/messense/.pyenv/versions/3.9.2/share/man"
	MKDIR_P = "/opt/homebrew/bin/gmkdir -p"
	MODBUILT_NAMES = "posix  errno  pwd  _sre  _codecs  _weakref  _functools  _operator  _collections  _abc  itertools  atexit  _signal  _stat  time  _thread  _locale  _io  faulthandler  _tracemalloc  _peg_parser  _symtable  xxsubtype"
	MODDISABLED_NAMES = ""
	MODLIBS = ""
	MODOBJS = "Modules/posixmodule.o  Modules/errnomodule.o  Modules/pwdmodule.o  Modules/_sre.o  Modules/_codecsmodule.o  Modules/_weakref.o  Modules/_functoolsmodule.o  Modules/_operator.o  Modules/_collectionsmodule.o  Modules/_abc.o  Modules/itertoolsmodule.o  Modules/atexitmodule.o  Modules/signalmodule.o  Modules/_stat.o  Modules/timemodule.o  Modules/_threadmodule.o  Modules/_localemodule.o  Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o  Modules/faulthandler.o  Modules/_tracemalloc.o  Modules/_peg_parser.o  Modules/symtablemodule.o  Modules/xxsubtype.o"
	MODULE_OBJS = "\"
	MULTIARCH = "darwin"
	MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"darwin\""
	MVWDELCH_IS_EXPRESSION = "1"
	NO_AS_NEEDED = ""
	OBJECT_OBJS = "\"
	OPENSSL_INCLUDES = "-I/opt/homebrew/opt/openssl@1.1/include"
	OPENSSL_LDFLAGS = "-L/opt/homebrew/opt/openssl@1.1/lib"
	OPENSSL_LIBS = "-lssl -lcrypto"
	OPT = "-DNDEBUG -g -fwrapv -O3 -Wall"
	OTHER_LIBTOOL_OPT = ""
	PACKAGE_BUGREPORT = "0"
	PACKAGE_NAME = "0"
	PACKAGE_STRING = "0"
	PACKAGE_TARNAME = "0"
	PACKAGE_URL = "0"
	PACKAGE_VERSION = "0"
	PARSER_HEADERS = "\"
	PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o"
	PEGEN_HEADERS = "\"
	PEGEN_OBJS = "\"
	PGO_PROF_GEN_FLAG = "-fprofile-instr-generate"
	PGO_PROF_USE_FLAG = "-fprofile-instr-use=code.profclangd"
	PLATLIBDIR = "lib"
	POBJS = "\"
	POSIX_SEMAPHORES_NOT_ENABLED = "0"
	PROFILE_TASK = "-m test --pgo"
	PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "0"
	PTHREAD_SYSTEM_SCHED_SUPPORTED = "1"
	PURIFY = ""
	PY3LIBRARY = ""
	PYLONG_BITS_IN_DIGIT = "0"
	PYTHON = "python"
	PYTHONFRAMEWORK = ""
	PYTHONFRAMEWORKDIR = "no-framework"
	PYTHONFRAMEWORKINSTALLDIR = ""
	PYTHONFRAMEWORKPREFIX = ""
	PYTHONPATH = ""
	PYTHON_FOR_BUILD = "./python.exe -E"
	PYTHON_HEADERS = "\"
	PYTHON_OBJS = "\"
	PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2""
	PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal -I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -DPy_BUILD_CORE_BUILTIN"
	PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"
	PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal"
	PY_COERCE_C_LOCALE = "1"
	PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal -I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -DPy_BUILD_CORE"
	PY_CORE_LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"
	PY_CPPFLAGS = "-I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include"
	PY_FORMAT_SIZE_T = ""z""
	PY_LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib"
	PY_LDFLAGS_NODIST = ""
	PY_SSL_DEFAULT_CIPHERS = "1"
	PY_SSL_DEFAULT_CIPHER_STRING = "0"
	PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal -I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include"
	Py_DEBUG = "0"
	Py_ENABLE_SHARED = "1"
	Py_HASH_ALGORITHM = "0"
	Py_TRACE_REFS = "0"
	QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \"
	READELF = ":"
	RESSRCDIR = "Mac/Resources/framework"
	RETSIGTYPE = "void"
	RUNSHARED = "DYLD_LIBRARY_PATH=/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2"
	SCRIPTDIR = "/Users/messense/.pyenv/versions/3.9.2/lib"
	SETPGRP_HAVE_ARG = "0"
	SGI_ABI = "@SGI_ABI@"
	SHELL = "/bin/sh"
	SHLIBS = "-ldl   -framework CoreFoundation"
	SHLIB_SUFFIX = ".so"
	SHM_NEEDS_LIBRT = "0"
	SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0"
	SITEPATH = ""
	SIZEOF_DOUBLE = "8"
	SIZEOF_FLOAT = "4"
	SIZEOF_FPOS_T = "8"
	SIZEOF_INT = "4"
	SIZEOF_LONG = "8"
	SIZEOF_LONG_DOUBLE = "8"
	SIZEOF_LONG_LONG = "8"
	SIZEOF_OFF_T = "8"
	SIZEOF_PID_T = "4"
	SIZEOF_PTHREAD_KEY_T = "8"
	SIZEOF_PTHREAD_T = "8"
	SIZEOF_SHORT = "2"
	SIZEOF_SIZE_T = "8"
	SIZEOF_TIME_T = "8"
	SIZEOF_UINTPTR_T = "8"
	SIZEOF_VOID_P = "8"
	SIZEOF_WCHAR_T = "4"
	SIZEOF__BOOL = "1"
	SO = ".cpython-39-darwin.so"
	SOABI = "cpython-39-darwin"
	SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs"
	SRC_GDB_HOOKS = "./Tools/gdb/libpython.py"
	STDC_HEADERS = "1"
	STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */"
	STRIPFLAG = "-s"
	SUBDIRS = ""
	SUBDIRSTOO = "Include Lib Misc"
	SYSLIBS = ""
	SYS_SELECT_WITH_SYS_TIME = "1"
	TCLTK_INCLUDES = ""
	TCLTK_LIBS = ""
	TESTOPTS = ""
	TESTPATH = ""
	TESTPYTHON = "DYLD_LIBRARY_PATH=/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2 ./python.exe"
	TESTPYTHONOPTS = ""
	TESTRUNNER = "DYLD_LIBRARY_PATH=/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2 ./python.exe ./Tools/scripts/run_tests.py"
	TESTTIMEOUT = "1200"
	TIMEMODULE_LIB = "0"
	TIME_WITH_SYS_TIME = "1"
	TM_IN_SYS_TIME = "0"
	TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo"
	UNICODE_DEPS = "\"
	UNIVERSALSDK = ""
	UPDATE_FILE = "python3.9 ./Tools/scripts/update_file.py"
	USE_COMPUTED_GOTOS = "0"
	VERSION = "3.9"
	WINDOW_HAS_FLAGS = "1"
	WITH_DECIMAL_CONTEXTVAR = "1"
	WITH_DOC_STRINGS = "1"
	WITH_DTRACE = "0"
	WITH_DYLD = "1"
	WITH_LIBINTL = "0"
	WITH_NEXT_FRAMEWORK = "0"
	WITH_PYMALLOC = "1"
	WITH_VALGRIND = "0"
	X87_DOUBLE_ROUNDING = "0"
	XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax"
	abiflags = ""
	abs_builddir = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2"
	abs_srcdir = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2"
	base = "/Users/messense/.pyenv/versions/test"
	datarootdir = "/Users/messense/.pyenv/versions/3.9.2/share"
	exec_prefix = "/Users/messense/.pyenv/versions/3.9.2"
	installed_base = "/Users/messense/.pyenv/versions/3.9.2"
	installed_platbase = "/Users/messense/.pyenv/versions/3.9.2"
	platbase = "/Users/messense/.pyenv/versions/test"
	platlibdir = "lib"
	prefix = "/Users/messense/.pyenv/versions/3.9.2"
	projectbase = "/Users/messense/.pyenv/versions/3.9.2/bin"
	py_version = "3.9.2"
	py_version_nodot = "39"
	py_version_short = "3.9"
	srcdir = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9/config-3.9-darwin"
	userbase = "/Users/messense/.local"

LIBDIR = "/Users/messense/.pyenv/versions/3.9.2/lib" is indeed not of the virtualenv but of the Python version that creates the virtualenv.

@davidhewitt
Copy link
Member

I think LIBDIR pointing to the original Python installation is correct, as afaik virtualenvs don't copy the library into them. The rest of the configuration looks good though.

I am still unsure why the embedded venv does not get detected on macOS but it does on Linux. (This could potentially be worthy of an upstream CPython bug report? I doubt they would change it for backwards-compatibility.)

You might be able to do what you need using the PEP 587 APIs manually before calling any PyO3 APIs: https://docs.python.org/3/c-api/init_config.html

@Bengreen
Copy link

I have observed the same problem as highlighted above.
When I run in a venv in osx (arm64, python 3.9) it does not seem to detect my sys.path.

if I run
python -c "import sys; print('\n'.join(sys.path))"
the resultant paths are:

python -c "import sys; print('\n'.join(sys.path))"

/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip
/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9
/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload
/Users/bengreene/Development/rusty-snakeskin/venv/lib/python3.9/site-packages
/Users/bengreene/Development/rusty-snakeskin/mypy

But if I run the similar code inside my pyo3:

let syspath: &PyList = py.import("sys")
  .unwrap()
  .get("path")
  .unwrap()
  .try_into()
  .unwrap();

println!("The syspath is {}", syspath);

The output is

The syspath is
['/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
'/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages']

I was previously running this same codebase on an intel Mac and did not see this issue (I can't easily re-run that at the moment (it was python3.8)

@Bengreen
Copy link

I installed python3.8 as an experiment and retried this same rust pyo3 above and have same reply. So still not picking up the venv path for sys.path to allow it to pick up the available modules.

@Bengreen
Copy link

Next step was to use the env var PYTHONPATH to set the paths to search (as an alternative to finding them via the venv). This seems to completely replace the sys.path rather than prepending it.

So as a follow on step I set the all the relevant paths using the PYTHONPATH env var.

This seems to work and I have bene able to load my python modules.
But I do not believe it is the right way to use PYTHONPATH. I believe PYTHONPATH is supposed to be used to extend the search path of python modules not to define the complete search path.

I base this on how python is working:

(venv) bengreene@Euclid rusty-snakeskin % export PYTHONPATH=/Users/bengreene/Development/rusty-snakeskin/venv/lib/python3.9/site-packagesafdfsdf
(venv) bengreene@Euclid rusty-snakeskin % python -c "import sys; print('\n'.join(sys.path))"                                                    

/Users/bengreene/Development/rusty-snakeskin/venv/lib/python3.9/site-packagesafdfsdf
/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip
/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9
/opt/homebrew/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload
/Users/bengreene/Development/rusty-snakeskin/venv/lib/python3.9/site-packages
/Users/bengreene/Development/rusty-snakeskin/mypy

So it points me to the sys.path is not being initialised correctly. I was not able to easily locate where in the code this was set. But if you can point me in the right direction I am happy to take a look.

@Bengreen
Copy link

Bengreen commented Nov 2, 2021

I went through some news groups, etc with regards to python embedded and identified the following related articles:
https://bugs.python.org/issue22213
https://bugs.python.org/issue35706
https://github.com/python/cpython/blob/main/Doc/extending/embedding.rst

Both seem to be aligned in:
Embedded python does not automatically calculate the module search path in a venv. That is the responsibility of the hosting application.

How this is done is not trivial and seems to be in flux on python (and may take some time to resolve).

So for perhaps the mean time using PYTHONPATH to set the path may be the best option.

@davidhewitt
Copy link
Member

Thank you for the research and for sharing. I was aware it was complicated but was unaware that it's also in flux. Hopefully things will settle soon; I'd be glad to implement something in PyO3 to support this eventually if possible.

@messense
Copy link
Member

Something like this could work?

diff --git a/src/gil.rs b/src/gil.rs
index 37e0ed2495..397f9560b0 100644
--- a/src/gil.rs
+++ b/src/gil.rs
@@ -71,6 +71,28 @@ pub fn prepare_freethreaded_python() {
         if ffi::Py_IsInitialized() == 0 {
             ffi::Py_InitializeEx(0);

+            #[cfg(target_os = "macos")]
+            if let Ok(venv) = std::env::var("VIRTUAL_ENV") {
+                // Safety: the GIL is already held because of the Py_IntializeEx call.
+                let pool = GILPool::new();
+                let py = pool.python();
+
+                let version_info = py.version_info();
+                let sys = py.import("sys").unwrap();
+                let sys_path = sys.getattr("path").unwrap();
+                sys_path
+                    .call_method1(
+                        "append",
+                        (format!(
+                            "{}/lib/python{}.{}/site-packages",
+                            venv, version_info.major, version_info.minor
+                        ),),
+                    )
+                    .unwrap();
+
+                drop(pool);
+            }
+
             // Release the GIL.
             ffi::PyEval_SaveThread();
         }

@davidhewitt
Copy link
Member

Perhaps, yes. Probably want to detect Conda environments in a similar way. (like we do in pyo3_build_config)

There's also ffi calls we could run before Py_Initiailize e.g. Py_SetPath

I fear that whatever logic we introduce may not work for everyone. I wonder if we can have prepare_freethreaded_python to do a sensible default and then have a builder pattern to be able to enable/disable various bits like this environment detection or pass in specific values.

@Goldziher
Copy link

Perhaps, yes. Probably want to detect Conda environments in a similar way. (like we do in pyo3_build_config)

There's also ffi calls we could run before Py_Initiailize e.g. Py_SetPath

I fear that whatever logic we introduce may not work for everyone. I wonder if we can have prepare_freethreaded_python to do a sensible default and then have a builder pattern to be able to enable/disable various bits like this environment detection or pass in specific values.

Hiya, I'm experiencing the same issue using poetry. The "solution" is to append to the PYTHONPATH the site-packagefolder` from the virtualenv lib, e.g.:

export PYTHONPATH=${PYTHONPATH}:/Users/naamanhirschfeld/Library/Caches/pypoetry/virtualenvs/starlite-s4i-xLL2-py3.10/lib/python3.10/site-packages/

This is of course very ugly and quite brittle. Can I suggest that as a safeguard, the user will be able to specify the env or virtual env (depending if running in system or virtual env of course) as a parameter passed to prepare_freethreaded_python?

@barakugav
Copy link

barakugav commented Oct 20, 2024

The solution proposed by @messense works great, but does not work if you have editable installed packages (aka packages installed with -e).
I still cant find a solution for this. Is there anything that can be done to help deal with this issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants