how to load and execute py file which consumes a thrid part C-based python extension in C# code
Hi there, I am a freshman and new to python.net. I have a *.py script which calls a third part python library, and the library is a ctypes python wrapper of a C++ dll (or say C-based python extension?). Frist I tried to make it using IronPython. IronPython works well when I load a pure python *.py (no third part libraries) file and execute it in C# code. But it failed when I load a *.py which comsumes a thrid part ctypes python wrapper library mentioned above. Then I turn to python.net. But I don't know how to load and execute *.py in C# code using python.net. Thanks. Zhiyu Li Student China 2013-03-28 lizy10b
What you are looking to do is "embed" a python interpreter in your .net project, using pythonnet, and then tell the runtime to execute your python script.
I have done this in one of my projects. It does work.
http://pythonnet.sourceforge.net/readme.html#embedding
Sent from my iPad
On Mar 28, 2013, at 8:31 AM, "lizy10b"
Hi there, I am a freshman and new to python.net. I have a *.py script which calls a third part python library, and the library is a ctypes python wrapper of a C++ dll (or say C-based python extension?). Frist I tried to make it using IronPython. IronPython works well when I load a pure python *.py (no third part libraries) file and execute it in C# code. But it failed when I load a *.py which comsumes a thrid part ctypes python wrapper library mentioned above.
Then I turn to python.net. But I don't know how to load and execute *.py in C# code using python.net.
Thanks.
Zhiyu Li Student China
2013-03-28 lizy10b _________________________________________________ Python.NET mailing list - PythonDotNet@python.org http://mail.python.org/mailman/listinfo/pythondotnet
Thank you, Bradley.
I found a simple sample code on the maillist. Now I could load and execute a pure python function in a py file in C#.
And a new problem is that the PythonEngine.ImportModule("modulename") method always return NULL in my case. The modulename.py comsumes a third part ctypes wrapped library (the Rtree 0.7 python library). It seems the PythonEngine can not find it, but actually it has been installed to the default path (C:\Python262\Lib\site-packages\rtree) , and the modulename.py file runs smoothly under python command line.
I worte a new py file which only contains a function returning the sys.path, and load it in C#, the sys.path seems OK.
So I don't know what's wrong....
Thanks.
Zhiyu Li
2013-03-29
lizy10b
发件人: Bradley Friedman
发送时间: 2013-03-28 22:15:18
收件人: lizy10b
抄送: pythondotnet
主题: Re: [Python.NET] how to load and execute py file which consumes a thrid part C-based python extension in C# code
What you are looking to do is "embed" a python interpreter in your .net project, using pythonnet, and then tell the runtime to execute your python script.
I have done this in one of my projects. It does work.
http://pythonnet.sourceforge.net/readme.html#embedding
Sent from my iPad
On Mar 28, 2013, at 8:31 AM, "lizy10b"
In my code I'm running:
Python.Runtime.PythonEngine.Initialize();
I also have these defined:
public void AddPythonPath(string path)
{
CheckInitPython();
IntPtr l = Python.Runtime.PythonEngine.AcquireLock();
Python.Runtime.PythonEngine.RunSimpleString("import sys");
Python.Runtime.PythonEngine.RunSimpleString("sys.path.append(\"" + path.Replace("\\", "\\\\") + "\")");
Python.Runtime.PythonEngine.ReleaseLock(l);
}
public Python.Runtime.PyObject ImportModule(string name)
{
CheckInitPython();
IntPtr l = Python.Runtime.PythonEngine.AcquireLock();
Python.Runtime.PyObject module = Python.Runtime.PythonEngine.ImportModule(name);
Python.Runtime.PythonEngine.ReleaseLock(l);
if (module == null)
{
throw new libscclient.PythonModuleNotCreatedException(name);
}
return module;
}
And when my code loads a "plugin" python module, it runs this:
string pythonVersionBasePath = GetPythonCodeBaseVersionPath(); //my dynamic plugin code.
string scriptName = GetPythonScriptName(); //also my dynamic plugin code.
System.Console.WriteLine("importing module");
Pedestal.AddPythonPath(pythonVersionBasePath); //calling code above
Python.Runtime.PyObject module = Pedestal.ImportModule(scriptName.Split(new char[] { '.' }, 2)[0]); //calling code above
System.Console.WriteLine("module imported");
IntPtr l = Pedestal.GetPythonLock();
module.InvokeMethod(GetPythonInitMethodName(), new Python.Runtime.PyObject[] { Python.Runtime.PyObject.FromManagedObject(this) }); //calling a method by name. the name comes from my dynamic plugin code.
module.Dispose(); //I'm done with the module so I toss it. my code here registers callbacks.
Pedestal.ReleasePythonLock(l);
On Mar 28, 2013, at 2:09 PM, "lizy10b"
Thank you, Bradley. I found a simple sample code on the maillist. Now I could load and execute a pure python function in a py file in C#.
And a new problem is that the PythonEngine.ImportModule("modulename") method always return NULL in my case. The modulename.py comsumes a third part ctypes wrapped library (the Rtree 0.7 python library). It seems the PythonEngine can not find it, but actually it has been installed to the default path (C:\Python262\Lib\site-packages\rtree) , and the modulename.py file runs smoothly under python command line. I worte a new py file which only contains a function returning the sys.path, and load it in C#, the sys.path seems OK. So I don't know what's wrong....
Thanks.
Zhiyu Li
2013-03-29 lizy10b 发件人: Bradley Friedman 发送时间: 2013-03-28 22:15:18 收件人: lizy10b 抄送: pythondotnet 主题: Re: [Python.NET] how to load and execute py file which consumes a thrid part C-based python extension in C# code What you are looking to do is "embed" a python interpreter in your .net project, using pythonnet, and then tell the runtime to execute your python script.
I have done this in one of my projects. It does work.
http://pythonnet.sourceforge.net/readme.html#embedding
Sent from my iPad
On Mar 28, 2013, at 8:31 AM, "lizy10b"
wrote: Hi there, I am a freshman and new to python.net. I have a *.py script which calls a third part python library, and the library is a ctypes python wrapper of a C++ dll (or say C-based python extension?). Frist I tried to make it using IronPython. IronPython works well when I load a pure python *.py (no third part libraries) file and execute it in C# code. But it failed when I load a *.py which comsumes a thrid part ctypes python wrapper library mentioned above.
Then I turn to python.net. But I don't know how to load and execute *.py in C# code using python.net.
Thanks.
Zhiyu Li Student China
2013-03-28 lizy10b _________________________________________________ Python.NET mailing list - PythonDotNet@python.org http://mail.python.org/mailman/listinfo/pythondotnet
Sorry. One more.
When my code then executes those callbacks, back into Python, it does so this way:
System.Console.WriteLine("Getting Projects");
List
In my code I'm running:
Python.Runtime.PythonEngine.Initialize();
I also have these defined:
public void AddPythonPath(string path) { CheckInitPython(); IntPtr l = Python.Runtime.PythonEngine.AcquireLock(); Python.Runtime.PythonEngine.RunSimpleString("import sys"); Python.Runtime.PythonEngine.RunSimpleString("sys.path.append(\"" + path.Replace("\\", "\\\\") + "\")"); Python.Runtime.PythonEngine.ReleaseLock(l); }
public Python.Runtime.PyObject ImportModule(string name) { CheckInitPython(); IntPtr l = Python.Runtime.PythonEngine.AcquireLock(); Python.Runtime.PyObject module = Python.Runtime.PythonEngine.ImportModule(name); Python.Runtime.PythonEngine.ReleaseLock(l); if (module == null) { throw new libscclient.PythonModuleNotCreatedException(name); } return module; }
And when my code loads a "plugin" python module, it runs this:
string pythonVersionBasePath = GetPythonCodeBaseVersionPath(); //my dynamic plugin code. string scriptName = GetPythonScriptName(); //also my dynamic plugin code. System.Console.WriteLine("importing module"); Pedestal.AddPythonPath(pythonVersionBasePath); //calling code above Python.Runtime.PyObject module = Pedestal.ImportModule(scriptName.Split(new char[] { '.' }, 2)[0]); //calling code above System.Console.WriteLine("module imported"); IntPtr l = Pedestal.GetPythonLock(); module.InvokeMethod(GetPythonInitMethodName(), new Python.Runtime.PyObject[] { Python.Runtime.PyObject.FromManagedObject(this) }); //calling a method by name. the name comes from my dynamic plugin code. module.Dispose(); //I'm done with the module so I toss it. my code here registers callbacks. Pedestal.ReleasePythonLock(l);
On Mar 28, 2013, at 2:09 PM, "lizy10b"
wrote: Thank you, Bradley. I found a simple sample code on the maillist. Now I could load and execute a pure python function in a py file in C#.
And a new problem is that the PythonEngine.ImportModule("modulename") method always return NULL in my case. The modulename.py comsumes a third part ctypes wrapped library (the Rtree 0.7 python library). It seems the PythonEngine can not find it, but actually it has been installed to the default path (C:\Python262\Lib\site-packages\rtree) , and the modulename.py file runs smoothly under python command line. I worte a new py file which only contains a function returning the sys.path, and load it in C#, the sys.path seems OK. So I don't know what's wrong....
Thanks.
Zhiyu Li
2013-03-29 lizy10b 发件人: Bradley Friedman 发送时间: 2013-03-28 22:15:18 收件人: lizy10b 抄送: pythondotnet 主题: Re: [Python.NET] how to load and execute py file which consumes a thrid part C-based python extension in C# code What you are looking to do is "embed" a python interpreter in your .net project, using pythonnet, and then tell the runtime to execute your python script.
I have done this in one of my projects. It does work.
http://pythonnet.sourceforge.net/readme.html#embedding
Sent from my iPad
On Mar 28, 2013, at 8:31 AM, "lizy10b"
wrote: Hi there, I am a freshman and new to python.net. I have a *.py script which calls a third part python library, and the library is a ctypes python wrapper of a C++ dll (or say C-based python extension?). Frist I tried to make it using IronPython. IronPython works well when I load a pure python *.py (no third part libraries) file and execute it in C# code. But it failed when I load a *.py which comsumes a thrid part ctypes python wrapper library mentioned above.
Then I turn to python.net. But I don't know how to load and execute *.py in C# code using python.net.
Thanks.
Zhiyu Li Student China
2013-03-28 lizy10b _________________________________________________ Python.NET mailing list - PythonDotNet@python.org http://mail.python.org/mailman/listinfo/pythondotnet
_________________________________________________ Python.NET mailing list - PythonDotNet@python.org http://mail.python.org/mailman/listinfo/pythondotnet
Thanks for your code, Bradley
I followed your sample, add the path first , then PythonEngine.ImportModule,
spending all the day in embeding the third part C-based library into my C# code, but PythonEngine.ImportModule still return Null.
I wrote a simple test C dll (only one function returns a+1), and a wrapper py file using the ctypes.
Then load the py file in C#, the PythonEngine.ImportModule does return a non-null value, but when invoke the function is saids can not find the dll. When I put the dll in the Python root dir (on my end is C:\Python262\) , the py file runs smoothly. I try to add the path of the dll into sys.path, but does not work, only putting it into the Python root dir works.
So I think the situation is: third part C-base python library (in my case, rtree and psycopg2) uses more complex ctypes warpper, so maybe the python.net is incomptible to it? or I still have some chance to make it work, maybe still the sys.path problem?
Thanks
Zhiyu Li
2013-03-29
lizy10b
发件人: brad@fie.us
发送时间: 2013-03-29 06:03:32
收件人: lizy10b
抄送: pythondotnet
主题: Re: [Python.NET] how to load and execute py file which consumes a thrid part C-based python extension in C# code
Sorry. One more.
When my code then executes those callbacks, back into Python, it does so this way:
System.Console.WriteLine("Getting Projects");
List
participants (3)
-
brad@fie.us
-
Bradley Friedman
-
lizy10b