[Tutor] Python C extension - which method?

Brad M thebigwurst at gmail.com
Sat May 5 20:49:59 EDT 2018


If I may ask, what's the difference between these two?

1)
import ctypes
hello = ctypes.WinDLL('hello', use_last_error=True)

2)
from ctypes import cdll
hello = cdll.LoadLibrary('hello.dll')



Both of them can return "1980" from  this:

hello.c

#include <stdio.h>

__declspec(dllexport) int say_something()
{
    return 1980;
}


On Sun, May 6, 2018 at 8:39 AM, Brad M <thebigwurst at gmail.com> wrote:

> Does this have any downside? I have noticed that printf("HI") in my .DLL;
> doesn't really print anything.
> I am on windows.
>
> cdll.LoadLibrary('helloworld.dll')
>
>
>
> My next question is that I need to return an array or a list of address or
> int or some type of data, but
> if I returned a pointer to the array of some data type, how does the
> python cope with it?
>
> For instance, my plan is to have 3 functions:
>
> 1) a function that return all addresses that have a given value to python,
> say, 9001
> 2) then I do something with python so that values change, the target value
> is now 1009.
> 3) a second function that takes all the addresses as input and then return
> adddress that have values of 1009.
>
> 4) repeat 2 and 3 until there is only 1 or so of address which correct
> values.
> 5) A 3rd function that takes only 1 address and simply return the values
> at that address.
>
> So the whole point of having 1-4 is to find the one address that contain
> that values I want, and then
> all I do is to call the 3rd function to find the values at that address.
>
>
>
> So basically what I need to know is if the method I am using,
> cdll.LoadLibrary('helloworld.dll')
> is proper or I need some other method, and then I would like to find out
> how to handle the data returned.
> (address)
>
> Thanks!!!
>
>
>
> On Sun, May 6, 2018 at 5:44 AM, Stefan Behnel <stefan_ml at behnel.de> wrote:
>
>> Hi,
>>
>> Brad M schrieb am 04.05.2018 um 11:30:
>> > I want to create a C-based memory scanner for Python, and so far this is
>> > how I do it:
>> >
>> > Python:
>> >
>> > from ctypes import cdll
>> > mydll = cdll.LoadLibrary('hello.dll')
>> > print(mydll.say_something())
>> >
>> > and hello.dll:
>> >
>> > #include <stdio.h>
>> > __declspec(dllexport) int say_something()
>> > {
>> >     return 1980;
>> > }
>> >
>> > so the printout is "1980"
>> >
>> > Is this alright?
>>
>>
>> Depends on your needs and your C/C++ knowledge.
>>
>> If you have a shared library that provides the ready-made functionality,
>> and accessing that native code at all is more important than calling it
>> very quickly (e.g. you only do a few longish-running calls into it), then
>> wrapping a shared library with ctypes (or preferably cffi) is a good way
>> to
>> do it.
>>
>> Otherwise, try either a native wrapper generator like pybind11, or write
>> your wrapper in Cython.
>>
>> Specifically, if you are not just calling into an external library 1:1,
>> but
>> need to do (or can benefit from doing) non-trivial operations in native
>> code, definitely use Cython.
>>
>> http://cython.org
>>
>>
>> > I am aware that there is another much more complicated
>> > method such as this:
>> >
>> > https://tutorialedge.net/python/python-c-extensions-tutorial
>> /#building-and-installing-our-module
>>
>> Well, yes, it exists, but I advise against wrapping C code manually that
>> way. It's just too cumbersome and error prone. Leave it to the experts who
>> have already written their tools for you.
>>
>> Stefan
>>
>>
>> Disclosure: I'm a Cython core dev, so I'm biased and I absolutely know
>> what
>> I'm talking about.
>>
>> _______________________________________________
>> Tutor maillist  -  Tutor at python.org
>> To unsubscribe or change subscription options:
>> https://mail.python.org/mailman/listinfo/tutor
>>
>
>


More information about the Tutor mailing list