On Jun 10, 2009, at 8:35 AM, Ondrej Certik wrote:

> On Wed, Jun 10, 2009 at 12:13 AM, Robert
> Bradshaw<[email protected]> wrote:
>> On Jun 9, 2009, at 11:03 AM, Ondrej Certik wrote:
>>
>>> Hi,
>>>
>>> I have the following problem -- I have a package hermes2d, with the
>>> structure:
>>>
>>> hermes2d/__init__.py
>>> hermes2d/_hermes2d.pyx + .pxd
>>> hermes2d/_forms.pyx
>>>
>>> and sometimes (depending on what the users tells cmake) I want to
>>> build the .so libraries out of the tree and put their paths to
>>> PYTHONPATH. Things just work as long as remove the file
>>> hermes2d/__init__.py during the cython compilation. The reason is  
>>> that
>>> if I do:
>>>
>>> cd hermes2d
>>> cython _forms.pyx
>>>
>>> it produces _forms.c with lines like:
>>>
>>>   __pyx_ptype_8hermes2d_9_hermes2d_LinSystem =
>>> __Pyx_ImportType("hermes2d._hermes2d", "LinSystem", sizeof(struct
>>> __pyx_obj_8hermes2d_9_hermes2d_LinSystem)); if
>>> (unlikely(!__pyx_ptype_8hermes2d_9_hermes2d_LinSystem))
>>> {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno =
>>> __LINE__; goto __pyx_L1_error;}
>>>
>>> Notice the import "hermes2d._hermes2d", which fails if  
>>> _hermes2d.so is
>>> out of the tree (e..g somewhere else on the filesystem, even if it's
>>> in the search path!). If, however I remove the __init__.py, then
>>> cython generates:
>>>
>>>   __pyx_ptype_9_hermes2d_LinSystem = __Pyx_ImportType("_hermes2d",
>>> "LinSystem", sizeof(struct __pyx_obj_9_hermes2d_LinSystem)); if
>>> (unlikely(!__pyx_ptype_9_hermes2d_LinSystem)) {__pyx_filename =
>>> __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto
>>> __pyx_L1_error;}
>>>
>>> and everything just works, no matter where the file _hermes2d.so
>>> actually is.
>>>
>>> Now my question is -- if I want those .so libraries not to be in the
>>> tree, am I doing things the right way? E.g. I just have a line:
>>>
>>> from _forms import *
>>>
>>> in the hermes2d/forms.py
>>>
>>> and then people just do "from hermes2d import forms" and things  
>>> work,
>>> no matter where the .so files are. But I need some way to force  
>>> cython
>>> to just pretend there is no __init__.py in there. Why is cython  
>>> doing
>>> this check at all? Does it have any advantages?
>>
>> One advantage I see is that you may have two modules named _hermes2d
>> in different packages that it might have to distinguish. (OK, rare
>> with that name, but it could happen with more common names). Also,
>> this way the module path is fully qualified as one would expect.
>
> Ok. So how do you propose I should fix the problem, if I need those
> .so libraries at different place than the rest of the python source
> files?

I don't know. A hack is to have your setup.py actually move the  
__init__.py temporarily--I'm sure there's a better longterm fix  
though. Just out of curiosity, why do you need to segregate the .so  
files?

- Robert


_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to