Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -517,13 +517,74 @@ which may be called at startup without having acquired the GIL.

When finished using Python APIs, managed code must call a corresponding
`PythonEngine.ReleaseLock` to release the GIL and allow other threads
to use Python.
to use Python:

```csharp
IntPtr gilState = PythonEngine.AcquireLock();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should not encourage this, the Py.GIL part should be enough.


PythonEngine.Exec("doStuff()");

PythonEngine.ReleaseLock(gilState);
```

A `using` statement may also be used to acquire and release the GIL:

```csharp
using (Py.GIL())
{
PythonEngine.Exec("doStuff()");
}
```

The AcquireLock and ReleaseLock methods are thin wrappers over the
unmanaged `PyGILState_Ensure` and `PyGILState_Release` functions from
the Python API, and the documentation for those APIs applies to
the managed versions.

## Passing C# Objects to the Python Engine

This section demonstrates how to pass a C# object to the Python runtime.
The example uses the following `Person` class:

```csharp
public class Person
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}

public string FirstName { get; set; }
public string LastName { get; set; }
}
```

In order to pass a C# object to the Python runtime, it must be converted to a
`PyObject`. This is done using the `ToPython` extension method. The `PyObject`
may then be added to a dictionary of local variables and passed to the
`PythonEngine.Exec` function:

```csharp
// create a person object
Person person = new Person("John", "Smith");

// acquire the GIL before using the Python interpreter
using (Py.GIL())
{
// convert the Person object to a PyObject
PyObject pyPerson = person.ToPython();

// create a Python variable "person"
PyDict locals = new PyDict();
locals["person"] = pyPerson;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have the PyScope interface to make this a bit easier.


// the person object may now be used in Python
string code = "fullName = person.FirstName + ' ' + person.LastName";
PythonEngine.Exec(code, null, locals.Handle);
}
```

## License

Python for .NET is released under the open source MIT License.
Expand Down