Skip to main content

pyo3/
marker.rs

1//! Fundamental properties of objects tied to the Python interpreter.
2//!
3//! The Python interpreter is not thread-safe. To protect the Python interpreter in multithreaded
4//! scenarios there is a global lock, the *global interpreter lock* (hereafter referred to as *GIL*)
5//! that must be held to safely interact with Python objects. This is why in PyO3 when you acquire
6//! the GIL you get a [`Python`] marker token that carries the *lifetime* of holding the GIL and all
7//! borrowed references to Python objects carry this lifetime as well. This will statically ensure
8//! that you can never use Python objects after dropping the lock - if you mess this up it will be
9//! caught at compile time and your program will fail to compile.
10//!
11//! It also supports this pattern that many extension modules employ:
12//! - Drop the GIL, so that other Python threads can acquire it and make progress themselves
13//! - Do something independently of the Python interpreter, like IO, a long running calculation or
14//!   awaiting a future
15//! - Once that is done, reacquire the GIL
16//!
17//! That API is provided by [`Python::detach`] and enforced via the [`Ungil`] bound on the
18//! closure and the return type. This is done by relying on the [`Send`] auto trait. `Ungil` is
19//! defined as the following:
20//!
21//! ```rust,no_run
22//! # #![allow(dead_code)]
23//! pub unsafe trait Ungil {}
24//!
25//! unsafe impl<T: Send> Ungil for T {}
26//! ```
27//!
28//! We piggy-back off the `Send` auto trait because it is not possible to implement custom auto
29//! traits on stable Rust. This is the solution which enables it for as many types as possible while
30//! making the API usable.
31//!
32//! In practice this API works quite well, but it comes with some drawbacks:
33//!
34//! ## Drawbacks
35//!
36//! There is no reason to prevent `!Send` types like [`Rc`] from crossing the closure. After all,
37//! [`Python::detach`] just lets other Python threads run - it does not itself launch a new
38//! thread.
39//!
40//! ```rust, compile_fail
41//! # #[cfg(feature = "nightly")]
42//! # compile_error!("this actually works on nightly")
43//! use pyo3::prelude::*;
44//! use std::rc::Rc;
45//!
46//! fn main() {
47//!     Python::attach(|py| {
48//!         let rc = Rc::new(5);
49//!
50//!         py.detach(|| {
51//!             // This would actually be fine...
52//!             println!("{:?}", *rc);
53//!         });
54//!     });
55//! }
56//! ```
57//!
58//! Because we are using `Send` for something it's not quite meant for, other code that
59//! (correctly) upholds the invariants of [`Send`] can cause problems.
60//!
61//! [`SendWrapper`] is one of those. Per its documentation:
62//!
63//! > A wrapper which allows you to move around non-Send-types between threads, as long as you
64//! > access the contained value only from within the original thread and make sure that it is
65//! > dropped from within the original thread.
66//!
67//! This will "work" to smuggle Python references across the closure, because we're not actually
68//! doing anything with threads:
69//!
70//! ```rust, no_run
71//! use pyo3::prelude::*;
72//! use pyo3::types::PyString;
73//! use send_wrapper::SendWrapper;
74//!
75//! Python::attach(|py| {
76//!     let string = PyString::new(py, "foo");
77//!
78//!     let wrapped = SendWrapper::new(string);
79//!
80//!     py.detach(|| {
81//! # #[cfg(not(feature = "nightly"))]
82//! # {
83//!         // 💥 Unsound! 💥
84//!         let smuggled: &Bound<'_, PyString> = &*wrapped;
85//!         println!("{:?}", smuggled);
86//! # }
87//!     });
88//! });
89//! ```
90//!
91//! For now the answer to that is "don't do that".
92//!
93//! # A proper implementation using an auto trait
94//!
95//! However on nightly Rust and when PyO3's `nightly` feature is
96//! enabled, `Ungil` is defined as the following:
97//!
98//! ```rust,no_run
99//! # #[cfg(any())]
100//! # {
101//! #![feature(auto_traits, negative_impls)]
102//!
103//! pub unsafe auto trait Ungil {}
104//!
105//! // It is unimplemented for the `Python` struct and Python objects.
106//! impl !Ungil for Python<'_> {}
107//! impl !Ungil for ffi::PyObject {}
108//!
109//! // `Py` wraps it in  a safe api, so this is OK
110//! unsafe impl<T> Ungil for Py<T> {}
111//! # }
112//! ```
113//!
114//! With this feature enabled, the above two examples will start working and not working, respectively.
115//!
116//! [`SendWrapper`]: https://docs.rs/send_wrapper/latest/send_wrapper/struct.SendWrapper.html
117//! [`Rc`]: std::rc::Rc
118//! [`Py`]: crate::Py
119use crate::conversion::IntoPyObject;
120use crate::err::{self, PyResult};
121use crate::internal::state::{AttachGuard, SuspendAttach};
122use crate::types::any::PyAnyMethods;
123use crate::types::{
124    PyAny, PyCode, PyCodeMethods, PyDict, PyEllipsis, PyModule, PyNone, PyNotImplemented, PyString,
125    PyType,
126};
127use crate::version::PythonVersionInfo;
128use crate::{ffi, Bound, Py, PyTypeInfo};
129use std::ffi::CStr;
130use std::marker::PhantomData;
131use std::sync::LazyLock;
132
133/// Types that are safe to access while the GIL is not held.
134///
135/// # Safety
136///
137/// The type must not carry borrowed Python references or, if it does, not allow access to them if
138/// the GIL is not held.
139///
140/// See the [module-level documentation](self) for more information.
141///
142/// # Examples
143///
144/// This tracking is currently imprecise as it relies on the [`Send`] auto trait on stable Rust.
145/// For example, an `Rc` smart pointer should be usable without the GIL, but we currently prevent that:
146///
147/// ```compile_fail
148/// # use pyo3::prelude::*;
149/// use std::rc::Rc;
150///
151/// Python::attach(|py| {
152///     let rc = Rc::new(42);
153///
154///     py.detach(|| {
155///         println!("{:?}", rc);
156///     });
157/// });
158/// ```
159///
160/// This also implies that the interplay between `attach` and `detach` is unsound, for example
161/// one can circumvent this protection using the [`send_wrapper`](https://docs.rs/send_wrapper/) crate:
162///
163/// ```no_run
164/// # use pyo3::prelude::*;
165/// # use pyo3::types::PyString;
166/// use send_wrapper::SendWrapper;
167///
168/// Python::attach(|py| {
169///     let string = PyString::new(py, "foo");
170///
171///     let wrapped = SendWrapper::new(string);
172///
173///     py.detach(|| {
174///         let sneaky: &Bound<'_, PyString> = &*wrapped;
175///
176///         println!("{:?}", sneaky);
177///     });
178/// });
179/// ```
180///
181/// Fixing this loophole on stable Rust has significant ergonomic issues, but it is fixed when using
182/// nightly Rust and the `nightly` feature, c.f. [#2141](https://github.com/PyO3/pyo3/issues/2141).
183#[cfg_attr(docsrs, doc(cfg(all())))] // Hide the cfg flag
184#[cfg(not(feature = "nightly"))]
185pub unsafe trait Ungil {}
186
187#[cfg_attr(docsrs, doc(cfg(all())))] // Hide the cfg flag
188#[cfg(not(feature = "nightly"))]
189unsafe impl<T: Send> Ungil for T {}
190
191#[cfg(feature = "nightly")]
192mod nightly {
193    macro_rules! define {
194        ($($tt:tt)*) => { $($tt)* }
195    }
196
197    define! {
198        /// Types that are safe to access while the GIL is not held.
199        ///
200        /// # Safety
201        ///
202        /// The type must not carry borrowed Python references or, if it does, not allow access to them if
203        /// the GIL is not held.
204        ///
205        /// See the [module-level documentation](self) for more information.
206        ///
207        /// # Examples
208        ///
209        /// Types which are `Ungil` cannot be used in contexts where the GIL was released, e.g.
210        ///
211        /// ```compile_fail
212        /// # use pyo3::prelude::*;
213        /// # use pyo3::types::PyString;
214        /// Python::attach(|py| {
215        ///     let string = PyString::new(py, "foo");
216        ///
217        ///     py.detach(|| {
218        ///         println!("{:?}", string);
219        ///     });
220        /// });
221        /// ```
222        ///
223        /// This applies to the [`Python`] token itself as well, e.g.
224        ///
225        /// ```compile_fail
226        /// # use pyo3::prelude::*;
227        /// Python::attach(|py| {
228        ///     py.detach(|| {
229        ///         drop(py);
230        ///     });
231        /// });
232        /// ```
233        ///
234        /// On nightly Rust, this is not based on the [`Send`] auto trait and hence we are able
235        /// to prevent incorrectly circumventing it using e.g. the [`send_wrapper`](https://docs.rs/send_wrapper/) crate:
236        ///
237        /// ```compile_fail
238        /// # use pyo3::prelude::*;
239        /// # use pyo3::types::PyString;
240        /// use send_wrapper::SendWrapper;
241        ///
242        /// Python::attach(|py| {
243        ///     let string = PyString::new(py, "foo");
244        ///
245        ///     let wrapped = SendWrapper::new(string);
246        ///
247        ///     py.detach(|| {
248        ///         let sneaky: &PyString = *wrapped;
249        ///
250        ///         println!("{:?}", sneaky);
251        ///     });
252        /// });
253        /// ```
254        ///
255        /// This also enables using non-[`Send`] types in `detach`,
256        /// at least if they are not also bound to the GIL:
257        ///
258        /// ```rust
259        /// # use pyo3::prelude::*;
260        /// use std::rc::Rc;
261        ///
262        /// Python::attach(|py| {
263        ///     let rc = Rc::new(42);
264        ///
265        ///     py.detach(|| {
266        ///         println!("{:?}", rc);
267        ///     });
268        /// });
269        /// ```
270        pub unsafe auto trait Ungil {}
271    }
272
273    impl !Ungil for crate::Python<'_> {}
274
275    // This means that PyString, PyList, etc all inherit !Ungil from  this.
276    impl !Ungil for crate::PyAny {}
277
278    impl<T> !Ungil for crate::PyRef<'_, T> {}
279    impl<T> !Ungil for crate::PyRefMut<'_, T> {}
280
281    // FFI pointees
282    impl !Ungil for crate::ffi::PyObject {}
283    impl !Ungil for crate::ffi::PyLongObject {}
284
285    impl !Ungil for crate::ffi::PyThreadState {}
286    impl !Ungil for crate::ffi::PyInterpreterState {}
287    impl !Ungil for crate::ffi::PyWeakReference {}
288    impl !Ungil for crate::ffi::PyFrameObject {}
289    impl !Ungil for crate::ffi::PyCodeObject {}
290    #[cfg(not(Py_LIMITED_API))]
291    impl !Ungil for crate::ffi::PyDictKeysObject {}
292    #[cfg(not(any(Py_LIMITED_API, Py_3_10)))]
293    impl !Ungil for crate::ffi::PyArena {}
294}
295
296#[cfg(feature = "nightly")]
297pub use nightly::Ungil;
298
299/// A marker token that represents holding the GIL.
300///
301/// It serves three main purposes:
302/// - It provides a global API for the Python interpreter, such as [`Python::eval`].
303/// - It can be passed to functions that require a proof of holding the GIL, such as
304///   [`Py::clone_ref`](crate::Py::clone_ref).
305/// - Its lifetime represents the scope of holding the GIL which can be used to create Rust
306///   references that are bound to it, such as [`Bound<'py, PyAny>`].
307///
308/// Note that there are some caveats to using it that you might need to be aware of. See the
309/// [Deadlocks](#deadlocks) and [Releasing and freeing memory](#releasing-and-freeing-memory)
310/// paragraphs for more information about that.
311///
312/// # Obtaining a Python token
313///
314/// The following are the recommended ways to obtain a [`Python<'py>`] token, in order of preference:
315/// - If you already have something with a lifetime bound to the GIL, such as [`Bound<'py, PyAny>`], you can
316///   use its `.py()` method to get a token.
317/// - In a function or method annotated with [`#[pyfunction]`](crate::pyfunction) or [`#[pymethods]`](crate::pymethods) you can declare it
318///   as a parameter, and PyO3 will pass in the token when Python code calls it.
319/// - When you need to acquire the GIL yourself, such as when calling Python code from Rust, you
320///   should call [`Python::attach`] to do that and pass your code as a closure to it.
321///
322/// The first two options are zero-cost; [`Python::attach`] requires runtime checking and may need to block
323/// to acquire the GIL.
324///
325/// # Deadlocks
326///
327/// Note that the GIL can be temporarily released by the Python interpreter during a function call
328/// (e.g. importing a module). In general, you don't need to worry about this because the GIL is
329/// reacquired before returning to the Rust code:
330///
331/// ```text
332/// `Python` exists   |=====================================|
333/// GIL actually held |==========|         |================|
334/// Rust code running |=======|                |==|  |======|
335/// ```
336///
337/// This behaviour can cause deadlocks when trying to lock a Rust mutex while holding the GIL:
338///
339///  * Thread 1 acquires the GIL
340///  * Thread 1 locks a mutex
341///  * Thread 1 makes a call into the Python interpreter which releases the GIL
342///  * Thread 2 acquires the GIL
343///  * Thread 2 tries to locks the mutex, blocks
344///  * Thread 1's Python interpreter call blocks trying to reacquire the GIL held by thread 2
345///
346/// To avoid deadlocking, you should release the GIL before trying to lock a mutex or `await`ing in
347/// asynchronous code, e.g. with [`Python::detach`].
348///
349/// # Releasing and freeing memory
350///
351/// The [`Python<'py>`] type can be used to create references to variables owned by the Python
352/// interpreter, using functions such as [`Python::eval`] and [`PyModule::import`].
353#[derive(Copy, Clone)]
354pub struct Python<'py>(PhantomData<&'py AttachGuard>, PhantomData<NotSend>);
355
356/// A marker type that makes the type !Send.
357/// Workaround for lack of !Send on stable (<https://github.com/rust-lang/rust/issues/68318>).
358struct NotSend(PhantomData<*mut Python<'static>>);
359
360impl Python<'_> {
361    /// Acquires the global interpreter lock, allowing access to the Python interpreter. The
362    /// provided closure `F` will be executed with the acquired `Python` marker token.
363    ///
364    /// If implementing [`#[pymethods]`](crate::pymethods) or [`#[pyfunction]`](crate::pyfunction),
365    /// declare `py: Python` as an argument. PyO3 will pass in the token to grant access to the GIL
366    /// context in which the function is running, avoiding the need to call `attach`.
367    ///
368    /// If the [`auto-initialize`] feature is enabled and the Python runtime is not already
369    /// initialized, this function will initialize it. See
370    #[cfg_attr(
371        not(any(PyPy, GraalPy)),
372        doc = "[`Python::initialize`](crate::marker::Python::initialize)"
373    )]
374    #[cfg_attr(PyPy, doc = "`Python::initialize")]
375    /// for details.
376    ///
377    /// If the current thread does not yet have a Python "thread state" associated with it,
378    /// a new one will be automatically created before `F` is executed and destroyed after `F`
379    /// completes.
380    ///
381    /// # Panics
382    ///
383    /// - If the [`auto-initialize`] feature is not enabled and the Python interpreter is not
384    ///   initialized.
385    /// - If the Python interpreter is in the process of [shutting down].
386    /// - If the current thread is currently in the middle of a GC traversal (i.e. called from
387    ///   within a `__traverse__` method).
388    ///
389    /// To avoid possible initialization or panics if calling in a context where the Python
390    /// interpreter might be unavailable, consider using [`Python::try_attach`].
391    ///
392    /// # Examples
393    ///
394    /// ```
395    /// use pyo3::prelude::*;
396    /// use pyo3::ffi::c_str;
397    ///
398    /// # fn main() -> PyResult<()> {
399    /// Python::attach(|py| -> PyResult<()> {
400    ///     let x: i32 = py.eval(c"5", None, None)?.extract()?;
401    ///     assert_eq!(x, 5);
402    ///     Ok(())
403    /// })
404    /// # }
405    /// ```
406    ///
407    /// [`auto-initialize`]: https://pyo3.rs/main/features.html#auto-initialize
408    /// [shutting down]: https://docs.python.org/3/glossary.html#term-interpreter-shutdown
409    #[inline]
410    #[track_caller]
411    pub fn attach<F, R>(f: F) -> R
412    where
413        F: for<'py> FnOnce(Python<'py>) -> R,
414    {
415        let guard = AttachGuard::attach();
416        f(guard.python())
417    }
418
419    /// Variant of [`Python::attach`] which will return without attaching to the Python
420    /// interpreter if the interpreter is in a state where it cannot be attached to:
421    ///
422    /// - If the Python interpreter is not initialized.
423    /// - If the Python interpreter is in the process of [shutting down].
424    /// - If the current thread is currently in the middle of a GC traversal (i.e. called from
425    ///   within a `__traverse__` method).
426    ///
427    /// Unlike `Python::attach`, this function will not initialize the Python interpreter,
428    /// even if the [`auto-initialize`] feature is enabled.
429    ///
430    /// Note that due to the nature of the underlying Python APIs used to implement this,
431    /// the behavior is currently provided on a best-effort basis; it is expected that a
432    /// future CPython version will introduce APIs which guarantee this behaviour. This
433    /// function is still recommended for use in the meanwhile as it provides the best
434    /// possible behaviour and should transparently change to an optimal implementation
435    /// once such APIs are available.
436    ///
437    /// [`auto-initialize`]: https://pyo3.rs/main/features.html#auto-initialize
438    /// [shutting down]: https://docs.python.org/3/glossary.html#term-interpreter-shutdown
439    #[inline]
440    #[track_caller]
441    pub fn try_attach<F, R>(f: F) -> Option<R>
442    where
443        F: for<'py> FnOnce(Python<'py>) -> R,
444    {
445        let guard = AttachGuard::try_attach().ok()?;
446        Some(f(guard.python()))
447    }
448
449    /// Prepares the use of Python.
450    ///
451    /// If the Python interpreter is not already initialized, this function will initialize it with
452    /// signal handling disabled (Python will not raise the `KeyboardInterrupt` exception). Python
453    /// signal handling depends on the notion of a 'main thread', which must be the thread that
454    /// initializes the Python interpreter.
455    ///
456    /// If the Python interpreter is already initialized, this function has no effect.
457    ///
458    /// This function is unavailable under PyPy because PyPy cannot be embedded in Rust (or any other
459    /// software). Support for this is tracked on the
460    /// [PyPy issue tracker](https://github.com/pypy/pypy/issues/3836).
461    ///
462    /// # Examples
463    /// ```rust
464    /// use pyo3::prelude::*;
465    ///
466    /// # fn main() -> PyResult<()> {
467    /// Python::initialize();
468    /// Python::attach(|py| py.run(c"print('Hello World')", None, None))
469    /// # }
470    /// ```
471    #[cfg(not(any(PyPy, GraalPy)))]
472    pub fn initialize() {
473        crate::interpreter_lifecycle::initialize();
474    }
475
476    /// Like [`Python::attach`] except Python interpreter state checking is skipped.
477    ///
478    /// Normally when attaching to the Python interpreter, PyO3 checks that it is in
479    /// an appropriate state (e.g. it is fully initialized). This function skips
480    /// those checks.
481    ///
482    /// # Safety
483    ///
484    /// If [`Python::attach`] would succeed, it is safe to call this function.
485    #[inline]
486    #[track_caller]
487    pub unsafe fn attach_unchecked<F, R>(f: F) -> R
488    where
489        F: for<'py> FnOnce(Python<'py>) -> R,
490    {
491        let guard = unsafe { AttachGuard::attach_unchecked() };
492
493        f(guard.python())
494    }
495}
496
497impl<'py> Python<'py> {
498    /// Temporarily releases the GIL, thus allowing other Python threads to run. The GIL will be
499    /// reacquired when `F`'s scope ends.
500    ///
501    /// If you don't need to touch the Python
502    /// interpreter for some time and have other Python threads around, this will let you run
503    /// Rust-only code while letting those other Python threads make progress.
504    ///
505    /// Only types that implement [`Ungil`] can cross the closure. See the
506    /// [module level documentation](self) for more information.
507    ///
508    /// If you need to pass Python objects into the closure you can use [`Py`]`<T>`to create a
509    /// reference independent of the GIL lifetime. However, you cannot do much with those without a
510    /// [`Python`] token, for which you'd need to reacquire the GIL.
511    ///
512    /// # Example: Releasing the GIL while running a computation in Rust-only code
513    ///
514    /// ```
515    /// use pyo3::prelude::*;
516    ///
517    /// #[pyfunction]
518    /// fn sum_numbers(py: Python<'_>, numbers: Vec<u32>) -> PyResult<u32> {
519    ///     // We release the GIL here so any other Python threads get a chance to run.
520    ///     py.detach(move || {
521    ///         // An example of an "expensive" Rust calculation
522    ///         let sum = numbers.iter().sum();
523    ///
524    ///         Ok(sum)
525    ///     })
526    /// }
527    /// #
528    /// # fn main() -> PyResult<()> {
529    /// #     Python::attach(|py| -> PyResult<()> {
530    /// #         let fun = pyo3::wrap_pyfunction!(sum_numbers, py)?;
531    /// #         let res = fun.call1((vec![1_u32, 2, 3],))?;
532    /// #         assert_eq!(res.extract::<u32>()?, 6_u32);
533    /// #         Ok(())
534    /// #     })
535    /// # }
536    /// ```
537    ///
538    /// Please see the [Parallelism] chapter of the guide for a thorough discussion of using
539    /// [`Python::detach`] in this manner.
540    ///
541    /// # Example: Passing borrowed Python references into the closure is not allowed
542    ///
543    /// ```compile_fail
544    /// use pyo3::prelude::*;
545    /// use pyo3::types::PyString;
546    ///
547    /// fn parallel_print(py: Python<'_>) {
548    ///     let s = PyString::new(py, "This object cannot be accessed without holding the GIL >_<");
549    ///     py.detach(move || {
550    ///         println!("{:?}", s); // This causes a compile error.
551    ///     });
552    /// }
553    /// ```
554    ///
555    /// [`Py`]: crate::Py
556    /// [`PyString`]: crate::types::PyString
557    /// [auto-traits]: https://doc.rust-lang.org/nightly/unstable-book/language-features/auto-traits.html
558    /// [Parallelism]: https://pyo3.rs/main/parallelism.html
559    pub fn detach<T, F>(self, f: F) -> T
560    where
561        F: Ungil + FnOnce() -> T,
562        T: Ungil,
563    {
564        // Use a guard pattern to handle reacquiring the GIL,
565        // so that the GIL will be reacquired even if `f` panics.
566        // The `Send` bound on the closure prevents the user from
567        // transferring the `Python` token into the closure.
568        let _guard = unsafe { SuspendAttach::new() };
569        f()
570    }
571
572    /// Evaluates a Python expression in the given context and returns the result.
573    ///
574    /// If `globals` is `None`, it defaults to Python module `__main__`.
575    /// If `locals` is `None`, it defaults to the value of `globals`.
576    ///
577    /// If `globals` doesn't contain `__builtins__`, default `__builtins__`
578    /// will be added automatically.
579    ///
580    /// # Examples
581    ///
582    /// ```
583    /// # use pyo3::prelude::*;
584    /// # use pyo3::ffi::c_str;
585    /// # Python::attach(|py| {
586    /// let result = py.eval(c"[i * 10 for i in range(5)]", None, None).unwrap();
587    /// let res: Vec<i64> = result.extract().unwrap();
588    /// assert_eq!(res, vec![0, 10, 20, 30, 40])
589    /// # });
590    /// ```
591    pub fn eval(
592        self,
593        code: &CStr,
594        globals: Option<&Bound<'py, PyDict>>,
595        locals: Option<&Bound<'py, PyDict>>,
596    ) -> PyResult<Bound<'py, PyAny>> {
597        let code = PyCode::compile(self, code, c"<string>", crate::types::PyCodeInput::Eval)?;
598        code.run(globals, locals)
599    }
600
601    /// Executes one or more Python statements in the given context.
602    ///
603    /// If `globals` is `None`, it defaults to Python module `__main__`.
604    /// If `locals` is `None`, it defaults to the value of `globals`.
605    ///
606    /// If `globals` doesn't contain `__builtins__`, default `__builtins__`
607    /// will be added automatically.
608    ///
609    /// # Examples
610    /// ```
611    /// use pyo3::{
612    ///     prelude::*,
613    ///     types::{PyBytes, PyDict},
614    ///     ffi::c_str,
615    /// };
616    /// Python::attach(|py| {
617    ///     let locals = PyDict::new(py);
618    ///     py.run(cr#"
619    /// import base64
620    /// s = 'Hello Rust!'
621    /// ret = base64.b64encode(s.encode('utf-8'))
622    /// "#,
623    ///         None,
624    ///         Some(&locals),
625    ///     )
626    ///     .unwrap();
627    ///     let ret = locals.get_item("ret").unwrap().unwrap();
628    ///     let b64 = ret.cast::<PyBytes>().unwrap();
629    ///     assert_eq!(b64.as_bytes(), b"SGVsbG8gUnVzdCE=");
630    /// });
631    /// ```
632    ///
633    /// You can use [`py_run!`](macro.py_run.html) for a handy alternative of `run`
634    /// if you don't need `globals` and unwrapping is OK.
635    pub fn run(
636        self,
637        code: &CStr,
638        globals: Option<&Bound<'py, PyDict>>,
639        locals: Option<&Bound<'py, PyDict>>,
640    ) -> PyResult<()> {
641        let code = PyCode::compile(self, code, c"<string>", crate::types::PyCodeInput::File)?;
642        code.run(globals, locals).map(|obj| {
643            debug_assert!(obj.is_none());
644        })
645    }
646
647    /// Gets the Python type object for type `T`.
648    #[inline]
649    pub fn get_type<T>(self) -> Bound<'py, PyType>
650    where
651        T: PyTypeInfo,
652    {
653        T::type_object(self)
654    }
655
656    /// Imports the Python module with the specified name.
657    pub fn import<N>(self, name: N) -> PyResult<Bound<'py, PyModule>>
658    where
659        N: IntoPyObject<'py, Target = PyString>,
660    {
661        PyModule::import(self, name)
662    }
663
664    /// Gets the Python builtin value `None`.
665    #[allow(non_snake_case)] // the Python keyword starts with uppercase
666    #[inline]
667    pub fn None(self) -> Py<PyAny> {
668        PyNone::get(self).to_owned().into_any().unbind()
669    }
670
671    /// Gets the Python builtin value `Ellipsis`, or `...`.
672    #[allow(non_snake_case)] // the Python keyword starts with uppercase
673    #[inline]
674    pub fn Ellipsis(self) -> Py<PyAny> {
675        PyEllipsis::get(self).to_owned().into_any().unbind()
676    }
677
678    /// Gets the Python builtin value `NotImplemented`.
679    #[allow(non_snake_case)] // the Python keyword starts with uppercase
680    #[inline]
681    pub fn NotImplemented(self) -> Py<PyAny> {
682        PyNotImplemented::get(self).to_owned().into_any().unbind()
683    }
684
685    /// Deprecated version of [Python::version_str].
686    #[deprecated(since = "0.29.0", note = "use Python::version_str instead")]
687    pub fn version(self) -> &'static str {
688        Python::version_str()
689    }
690
691    /// Gets the running Python interpreter version as a string.
692    ///
693    /// # Examples
694    /// ```rust
695    /// # use pyo3::Python;
696    /// assert!(Python::version_str().starts_with("3."));
697    /// ```
698    pub fn version_str() -> &'static str {
699        static VERSION: LazyLock<&'static str> = LazyLock::new(|| unsafe {
700            CStr::from_ptr(ffi::Py_GetVersion())
701                .to_str()
702                .expect("Python version string not UTF-8")
703        });
704
705        &VERSION
706    }
707
708    /// Gets the running Python interpreter version as a struct similar to
709    /// `sys.version_info`.
710    ///
711    /// # Examples
712    /// ```rust
713    /// # use pyo3::Python;
714    /// Python::attach(|py| {
715    ///     // PyO3 supports Python 3.8 and up.
716    ///     assert!(py.version_info() >= (3, 8));
717    ///     assert!(py.version_info() >= (3, 8, 0));
718    /// });
719    /// ```
720    pub fn version_info(self) -> PythonVersionInfo {
721        let version_str = Python::version_str();
722
723        // Portion of the version string returned by Py_GetVersion up to the first space is the
724        // version number.
725        let version_number_str = version_str.split(' ').next().unwrap_or(version_str);
726
727        PythonVersionInfo::from_str(version_number_str).unwrap()
728    }
729
730    /// Lets the Python interpreter check and handle any pending signals. This will invoke the
731    /// corresponding signal handlers registered in Python (if any).
732    ///
733    /// Returns `Err(`[`PyErr`](crate::PyErr)`)` if any signal handler raises an exception.
734    ///
735    /// These signals include `SIGINT` (normally raised by CTRL + C), which by default raises
736    /// `KeyboardInterrupt`. For this reason it is good practice to call this function regularly
737    /// as part of long-running Rust functions so that users can cancel it.
738    ///
739    /// # Example
740    ///
741    /// ```rust,no_run
742    /// # #![allow(dead_code)] // this example is quite impractical to test
743    /// use pyo3::prelude::*;
744    ///
745    /// # fn main() {
746    /// #[pyfunction]
747    /// fn loop_forever(py: Python<'_>) -> PyResult<()> {
748    ///     loop {
749    ///         // As this loop is infinite it should check for signals every once in a while.
750    ///         // Using `?` causes any `PyErr` (potentially containing `KeyboardInterrupt`)
751    ///         // to break out of the loop.
752    ///         py.check_signals()?;
753    ///
754    ///         // do work here
755    ///         # break Ok(()) // don't actually loop forever
756    ///     }
757    /// }
758    /// # }
759    /// ```
760    ///
761    /// # Note
762    ///
763    /// This function calls [`PyErr_CheckSignals()`][1] which in turn may call signal handlers.
764    /// As Python's [`signal`][2] API allows users to define custom signal handlers, calling this
765    /// function allows arbitrary Python code inside signal handlers to run.
766    ///
767    /// If the function is called from a non-main thread, or under a non-main Python interpreter,
768    /// it does nothing yet still returns `Ok(())`.
769    ///
770    /// [1]: https://docs.python.org/3/c-api/exceptions.html?highlight=pyerr_checksignals#c.PyErr_CheckSignals
771    /// [2]: https://docs.python.org/3/library/signal.html
772    pub fn check_signals(self) -> PyResult<()> {
773        err::error_on_minusone(self, unsafe { ffi::PyErr_CheckSignals() })
774    }
775}
776
777impl<'unbound> Python<'unbound> {
778    /// Unsafely creates a Python token with an unbounded lifetime.
779    ///
780    /// Many of PyO3 APIs use [`Python<'_>`] as proof that the calling thread is attached to the
781    /// interpreter, but this function can be used to call them unsafely.
782    ///
783    /// # Safety
784    ///
785    /// - This token and any borrowed Python references derived from it can only be safely used
786    ///   whilst the currently executing thread is actually attached to the interpreter.
787    /// - This function creates a token with an *unbounded* lifetime. Safe code can assume that
788    ///   holding a [`Python<'py>`] token means the thread is attached and stays attached for the
789    ///   lifetime `'py`. If you let it or borrowed Python references escape to safe code you are
790    ///   responsible for bounding the lifetime `'unbound` appropriately. For more on unbounded
791    ///   lifetimes, see the [nomicon].
792    ///
793    /// [nomicon]: https://doc.rust-lang.org/nomicon/unbounded-lifetimes.html
794    #[inline]
795    pub unsafe fn assume_attached() -> Python<'unbound> {
796        Python(PhantomData, PhantomData)
797    }
798}
799
800#[cfg(test)]
801mod tests {
802    use super::*;
803    use crate::{
804        internal::state::ForbidAttaching,
805        types::{IntoPyDict, PyList},
806    };
807
808    #[test]
809    fn test_eval() {
810        Python::attach(|py| {
811            // Make sure builtin names are accessible
812            let v: i32 = py
813                .eval(c"min(1, 2)", None, None)
814                .map_err(|e| e.display(py))
815                .unwrap()
816                .extract()
817                .unwrap();
818            assert_eq!(v, 1);
819
820            let d = [("foo", 13)].into_py_dict(py).unwrap();
821
822            // Inject our own global namespace
823            let v: i32 = py
824                .eval(c"foo + 29", Some(&d), None)
825                .unwrap()
826                .extract()
827                .unwrap();
828            assert_eq!(v, 42);
829
830            // Inject our own local namespace
831            let v: i32 = py
832                .eval(c"foo + 29", None, Some(&d))
833                .unwrap()
834                .extract()
835                .unwrap();
836            assert_eq!(v, 42);
837
838            // Make sure builtin names are still accessible when using a local namespace
839            let v: i32 = py
840                .eval(c"min(foo, 2)", None, Some(&d))
841                .unwrap()
842                .extract()
843                .unwrap();
844            assert_eq!(v, 2);
845        });
846    }
847
848    #[test]
849    #[cfg(not(target_arch = "wasm32"))] // We are building wasm Python with pthreads disabled
850    fn test_detach_releases_and_acquires_gil() {
851        Python::attach(|py| {
852            let b = std::sync::Arc::new(std::sync::Barrier::new(2));
853
854            let b2 = b.clone();
855            std::thread::spawn(move || Python::attach(|_| b2.wait()));
856
857            py.detach(|| {
858                // If `detach` does not release the GIL, this will deadlock because
859                // the thread spawned above will never be able to acquire the GIL.
860                b.wait();
861            });
862
863            unsafe {
864                // If the GIL is not reacquired at the end of `detach`, this call
865                // will crash the Python interpreter.
866                let tstate = ffi::PyEval_SaveThread();
867                ffi::PyEval_RestoreThread(tstate);
868            }
869        });
870    }
871
872    #[test]
873    #[cfg(panic = "unwind")]
874    fn test_detach_panics_safely() {
875        Python::attach(|py| {
876            let result = std::panic::catch_unwind(|| unsafe {
877                let py = Python::assume_attached();
878                py.detach(|| {
879                    panic!("There was a panic!");
880                });
881            });
882
883            // Check panic was caught
884            assert!(result.is_err());
885
886            // If `detach` is implemented correctly, this thread still owns the GIL here
887            // so the following Python calls should not cause crashes.
888            let list = PyList::new(py, [1, 2, 3, 4]).unwrap();
889            assert_eq!(list.extract::<Vec<i32>>().unwrap(), vec![1, 2, 3, 4]);
890        });
891    }
892
893    #[cfg(not(pyo3_disable_reference_pool))]
894    #[test]
895    fn test_detach_pass_stuff_in() {
896        let list = Python::attach(|py| PyList::new(py, vec!["foo", "bar"]).unwrap().unbind());
897        let mut v = vec![1, 2, 3];
898        let a = std::sync::Arc::new(String::from("foo"));
899
900        Python::attach(|py| {
901            py.detach(|| {
902                drop((list, &mut v, a));
903            });
904        });
905    }
906
907    #[test]
908    #[cfg(not(Py_LIMITED_API))]
909    fn test_acquire_gil() {
910        use std::ffi::c_int;
911
912        const GIL_NOT_HELD: c_int = 0;
913        const GIL_HELD: c_int = 1;
914
915        // Before starting the interpreter the state of calling `PyGILState_Check`
916        // seems to be undefined, so let's ensure that Python is up.
917        #[cfg(not(any(PyPy, GraalPy)))]
918        Python::initialize();
919
920        let state = unsafe { crate::ffi::PyGILState_Check() };
921        assert_eq!(state, GIL_NOT_HELD);
922
923        Python::attach(|_| {
924            let state = unsafe { crate::ffi::PyGILState_Check() };
925            assert_eq!(state, GIL_HELD);
926        });
927
928        let state = unsafe { crate::ffi::PyGILState_Check() };
929        assert_eq!(state, GIL_NOT_HELD);
930    }
931
932    #[test]
933    fn test_ellipsis() {
934        Python::attach(|py| {
935            assert_eq!(py.Ellipsis().to_string(), "Ellipsis");
936
937            let v = py
938                .eval(c"...", None, None)
939                .map_err(|e| e.display(py))
940                .unwrap();
941
942            assert!(v.eq(py.Ellipsis()).unwrap());
943        });
944    }
945
946    #[test]
947    fn test_py_run_inserts_globals() {
948        use crate::types::dict::PyDictMethods;
949
950        Python::attach(|py| {
951            let namespace = PyDict::new(py);
952            py.run(
953                c"class Foo: pass\na = int(3)",
954                Some(&namespace),
955                Some(&namespace),
956            )
957            .unwrap();
958            assert!(matches!(namespace.get_item("Foo"), Ok(Some(..))));
959            assert!(matches!(namespace.get_item("a"), Ok(Some(..))));
960            // 3.9 and older did not automatically insert __builtins__ if it wasn't inserted "by hand"
961            #[cfg(not(Py_3_10))]
962            assert!(matches!(namespace.get_item("__builtins__"), Ok(Some(..))));
963        })
964    }
965
966    #[cfg(feature = "macros")]
967    #[test]
968    fn test_py_run_inserts_globals_2() {
969        use std::ffi::CString;
970
971        #[crate::pyclass(crate = "crate", skip_from_py_object)]
972        #[derive(Clone)]
973        struct CodeRunner {
974            code: CString,
975        }
976
977        impl CodeRunner {
978            fn reproducer(&mut self, py: Python<'_>) -> PyResult<()> {
979                let variables = PyDict::new(py);
980                variables.set_item("cls", crate::Py::new(py, self.clone())?)?;
981
982                py.run(self.code.as_c_str(), Some(&variables), None)?;
983                Ok(())
984            }
985        }
986
987        #[crate::pymethods(crate = "crate")]
988        impl CodeRunner {
989            fn func(&mut self, py: Python<'_>) -> PyResult<()> {
990                py.import("math")?;
991                Ok(())
992            }
993        }
994
995        let mut runner = CodeRunner {
996            code: CString::new(
997                r#"
998cls.func()
999"#
1000                .to_string(),
1001            )
1002            .unwrap(),
1003        };
1004
1005        Python::attach(|py| {
1006            runner.reproducer(py).unwrap();
1007        });
1008    }
1009
1010    #[test]
1011    fn python_is_zst() {
1012        assert_eq!(std::mem::size_of::<Python<'_>>(), 0);
1013    }
1014
1015    #[test]
1016    fn test_try_attach_fail_during_gc() {
1017        Python::attach(|_| {
1018            assert!(Python::try_attach(|_| {}).is_some());
1019
1020            let guard = ForbidAttaching::during_traverse();
1021            assert!(Python::try_attach(|_| {}).is_none());
1022            drop(guard);
1023
1024            assert!(Python::try_attach(|_| {}).is_some());
1025        })
1026    }
1027
1028    #[test]
1029    fn test_try_attach_ok_when_detached() {
1030        Python::attach(|py| {
1031            py.detach(|| {
1032                assert!(Python::try_attach(|_| {}).is_some());
1033            });
1034        });
1035    }
1036}