python extensions: including project local headers

J Kenneth King james at agentultra.com
Fri Oct 24 11:11:44 EDT 2008


Philip Semanchuk <philip at semanchuk.com> writes:

> On Oct 23, 2008, at 3:18 PM, J Kenneth King wrote:
>
>> Philip Semanchuk <philip at semanchuk.com> writes:
>>
>>> On Oct 23, 2008, at 11:36 AM, J Kenneth King wrote:
>>>
>>>>
>>>> Hey everyone,
>>>>
>>>> I'm working on a python extension wrapper around Rob Hess'
>>>> implementation of a SIFT feature detector. I'm working on a
>>>> computer-vision based project that requires interfacing with
>>>> Python at
>>>> the higher layers, so I figured the best way to handle this would be
>>>> in
>>>> C (since my initial implementation in python was ungodly and slow).
>>>>
>>>> I can get distutils to compile the extension and install it in the
>>>> python path, but when I go to import it I get the wonderful
>>>> exception:
>>>>
>>>> ImportError: /usr/lib/python2.5/site-packages/pysift.so: undefined
>>>> symbol: _sift_features
>>>
>>>
>>> Kenneth,
>>> You're close but not interpreting the error quite correctly. This
>>> isn't an error from the compiler or preprocessor, it's a library
>>> error. Assuming this is dynamically linked, your OS is reporting
>>> that,
>>> at runtime, it can't find the library that contains _sift_features.
>>> Make sure that it's somewhere where your OS can find it.
>>
>> This is basically what I was looking for help with. So far the project
>> directory is:
>>
>> /pysift
>>  /sift
>>    ..
>>    /include
>>      ..
>>      sift.h
>>    /src
>>      ..
>>      sift.c
>>  /src
>>    pysift.c
>>  setup.py
>>
>> I thought I could just #include "sift.h" in pysift.c as long as
>> distutils passed the right -I path to gcc.
>
> That's true, and it sounds like you've got that part working.
>
>
>> Maybe I should compile the sift code as a shared object and link it to
>> my extension? How would I get distutils to build the makefile and tell
>> gcc how to link it?
>>
>> Thanks for the reply. Python has spoiled me and my C is rather
>> rusty. :)
>
> I don't know how to get setup.py to build a shared object separately.
> I am in the same Python/C situation as you. I'm scrubbing the rust off
> of my C skills and I'm also a n00b at developing extensions. I've
> learned a lot from looking at other people's setup code, so maybe I
> can help you there.
>
> My posix_ipc module links to the realtime lib "rt" and here's the
> relevant snippets of setup.py:
>
> ------------------------------
> import distutils.core as duc
>
> libraries = [ ]
>
> libraries.append("rt")
>
> source_files = ["posix_ipc_module.c"]
>
> ext_modules = [ duc.Extension("posix_ipc",
>                               source_files,
>                               define_macros=define_macros,
>                               libraries=libraries
>                              )
>               ]
>
> duc.setup(name="posix_ipc", version=VERSION, ext_modules=ext_modules)
>
> ------------------------------
>
> You can download the whole thing here if you want to examine all the
> code:
> http://semanchuk.com/philip/posix_ipc/
>
> HTH
> Philip

I'll take a look, thanks! :)



More information about the Python-list mailing list