[Python.NET] PythonEngine partially initialized?
Denis Akhiyarov
denis.akhiyarov at gmail.com
Thu Jul 28 15:42:25 EDT 2016
1. Jian, can you convert your code to simplified interface using Py.GIL()
calls? If not possible, please let us know why.
https://github.com/pythonnet/pythonnet/blob/master/README.md
2. Your first code sample (unit test) is self-contained, but in second code
sample (UI) it is not clear where you acquire and release the GIL?
3. Finally can you post this as an issue on github?
https://github.com/pythonnet/pythonnet/issues/new
Thanks,
Denis
On Thu, Jul 28, 2016 at 8:51 AM, Jian Wang <wjchicago at gmail.com> wrote:
> Dear PythonNet group,
>
> I am working on a c# project which would like to access functions written
> in python from time to time. Below is a wrapper function.
>
> I have a unittest setup for this function. Everytime I run this unittest,
> it will get information from python world as I desired.
>
> public ScriptContext GetContextFromScript()
> {
> ScriptContext scriptContext;
> try
> {
> if (!PythonEngine.IsInitialized)
> PythonEngine.Initialize();
> var threadState = PythonEngine.BeginAllowThreads();
> var gilState = PythonEngine.AcquireLock();
>
> PyObject mod =
> PythonEngine.ImportModule(this.GetModuleName());
> PyObject instance = mod.InvokeMethod("Strategy", new
> PyTuple());
> scriptContext
> =(ScriptContext)instance.InvokeMethod("SetContext", new
> PyTuple()).AsManagedObject(typeof (ScriptContext));
>
> PythonEngine.ReleaseLock(gilState);
> PythonEngine.EndAllowThreads(threadState);
> PythonEngine.Shutdown();
> }
> catch (Exception ex)
> {
> throw;
> }
> return scriptContext;
> }
>
> However, when I launch the UI and call this function by clicking some
> button, the program hangs at PythonEngine.Initialize().
>
> After debugging into the PythonNet source code, I found when calling
> through UI, the RunTime.Initialize() will return true for
> Runtime.Py_IsInitialized().
>
> internal static void Initialize()
> {
> is32bit = IntPtr.Size == 4;
>
> if (0 == Runtime.Py_IsInitialized())
> {
> Runtime.Py_Initialize();
> }
>
> if (0 == Runtime.PyEval_ThreadsInitialized())
> {
> Runtime.PyEval_InitThreads();
> }
> }
>
> And the whole initialize process will hang when result.Dispose() is
> called. It actually trying to acquire lock but cannot get it.
>
> using (StreamReader reader = new StreamReader(stream))
> {
> // add the contents of clr.py to the module
> string clr_py = reader.ReadToEnd();
> PyObject result = RunString(clr_py,
> module_globals, locals.Handle);
> if (null == result)
> throw new PythonException();
> result.Dispose();
> }
>
> It looks like something happend before code reaching this pythong wrapper
> function. PythonEninge is partially initialized with
> Runtime.Py_IsInitialized() = true and Runtime.PyEval_ThreadsInitialized() =
> false.
>
> Questions
> 1. what could be the possible cause for this situation?
> 2. If I cannot find the root cause and put BegineAllowThreads() there,
> what could be a solution for it?
>
> Many thanks!
>
> Jian
>
> _________________________________________________
> Python.NET mailing list - PythonDotNet at python.org
> https://mail.python.org/mailman/listinfo/pythondotnet
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythondotnet/attachments/20160728/f4afa872/attachment.html>
More information about the PythonDotNet
mailing list