pyo3
pyo3 copied to clipboard
Can not link to virtual environment on OS X
🐛 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 [email protected]A virtual environment was created withpython3 -m venv redvoxand 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"withgit = "https://github.com/PyO3/pyo3")?:
No
💥 Reproducing
- Activate the virtual environment
source /Users/anthony/venvs/redvox/bin/activate - Ensure matplotlib is installed
pip install matplotlib - 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/[email protected]/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/usr/local/opt/[email protected]/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/usr/local/opt/[email protected]/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/usr/local/opt/[email protected]/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?
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
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/[email protected]/bin/python3.8")
libdir: Some("/usr/local/opt/[email protected]/Frameworks/Python.framework/Versions/3.8/lib")
shared: true
base prefix: Some("/usr/local/Cellar/[email protected]/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/[email protected]/Frameworks/Python.framework/Versions/3.8/lib")
shared: true
base prefix: Some("/usr/local/Cellar/[email protected]/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.
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. 👍
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/[email protected]' '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/[email protected]/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/[email protected]/include"
OPENSSL_LDFLAGS = "-L/opt/homebrew/opt/[email protected]/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.
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
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/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip
/opt/homebrew/Cellar/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9
/opt/homebrew/Cellar/[email protected]/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/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/opt/homebrew/Cellar/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
'/opt/homebrew/Cellar/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/opt/homebrew/Cellar/[email protected]/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)
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.
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/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip
/opt/homebrew/Cellar/[email protected]/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9
/opt/homebrew/Cellar/[email protected]/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.
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.
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.
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();
}
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.
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_Initiailizee.g.Py_SetPathI fear that whatever logic we introduce may not work for everyone. I wonder if we can have
prepare_freethreaded_pythonto 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?