[Cython] Multiple modules in one compilation unit
dalcinl at gmail.com
Wed Mar 2 19:58:43 CET 2011
On 2 March 2011 13:01, Stefan Behnel <stefan_ml at behnel.de> wrote:
> Dag Sverre Seljebotn, 02.03.2011 16:37:
>> On 03/02/2011 04:11 PM, Lisandro Dalcin wrote:
>>> On 2 March 2011 08:35, Stefan Behnel<stefan_ml at behnel.de> wrote:
>>>> Dag Sverre Seljebotn, 02.03.2011 11:54:
>>>>> Problem is that Fortran code often has...interesting...programming
>>>>> practices. Global variables abound, and are often initialised between
>>>>> modules. Imagine:
>>>>> print compute_mod.get_alpha_squared()
>>>>> This behaves quite differently with two static versions rather than
>>>> Then I'd suggest always linking dynamically.
>>> And where are you going to put your fortran shared libraries? Dynamic
>>> linking details varies wildly across platforms... I'm very much
>>> understand Dag's use case and concerns, and I do think that some
>>> research in all this is worth it.
>> I'm not sure if there's much more to research at the moment -- Stefan says
>> it is possible, and that's what I wanted to know at this stage. If I want
>> it, I obviously need to implement it myself. (And if such a patch
>> implements PEP 3121 and there's a demonstrated need for it with some
>> I really can't see it getting rejected just out of it being in "poor
>> I.e., I'm going to make Fwrap spit out multiple pyx files and worry about
>> this later. If multiple .pyx in one .so was fundamentally impossible, I
>> might have gone another route with Fwrap. That was all.
> The feature I could imagine becoming part of Cython is "compiling packages".
> I.e. you'd call "cython" on a package and it would output a directory with a
> single __init__.so that contains the modules compiled from all .pyx/.py
> files in that package. Importing the package would then trigger an import of
> that __init__.so, which in turn will execute code in its init__init__()
> function to register the other modules.
$ cd /tmp/
$ mkdir pkg
$ touch pkg/__init__.so
$ python -c 'import pkg'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named pkg
So that's not going to work... The import machinery ignores
__init__.so files. Instead, you need a "package.so" file, the
initpackage() init function should in turn setup the package structure
and initialize submodules. I've sent privately to Dag an example of
how this should be done.
Predio CONICET-Santa Fe
Colectora RN 168 Km 472, Paraje El Pozo
3000 Santa Fe, Argentina
Tel: +54-342-4511594 (ext 1011)
More information about the cython-devel