2009-11-05 3 views
6

Come si compila un modulo C-Python in modo che sia locale a un altro? Per esempio. se ho un modulo chiamato "bar" e un altro modulo chiamato "mymodule", come faccio a compilare "bar" in modo che venga importato tramite "import mymodule.bar"?Estensioni/moduli C di Python nidificati?

(scusate se questo è mal formulata, non ero sicuro di quello che il termine corretto perché era.)

ho provato quanto segue in setup.py, ma non sembra funzionare:

from distutils.core import setup, Extension 

setup(name='mymodule', 
     version='1.0', 
     author='Me', 
     ext_modules=[Extension('mymodule', ['mymodule-module.c']), 
        Extension('bar', ['bar-module.c'])]) 

Modifica

Grazie Alex. Quindi questo è quello che ho finito per usare:

from distutils.core import setup, Extension 

PACKAGE_NAME = 'mymodule' 

setup(name=PACKAGE_NAME, 
     version='1.0', 
     author='Me', 
     packages=[PACKAGE_NAME], 
     ext_package=PACKAGE_NAME 
     ext_modules=[Extension('foo', ['mymodule-foo-module.c']), 
        Extension('bar', ['mymodule-bar-module.c'])]) 

con ovviamente una cartella denominata "mymodule" contenente __init__.py.

risposta

3

Le istruzioni sono here:

Extension ('foo', [ 'src/foo1.c', 'src/foo2.c'])

descrive un'estensione che vive in package principale, mentre

Extension ('pkg.foo', [ 'src/foo1.c', 'src/foo2.c'])

descrive lo stesso extensi attivato nel pacchetto pkg . I file sorgente e il codice oggetto risultante sono identici in in entrambi i casi; l'unica differenza è dove nel filesystem (e quindi dove nella gerarchia dello spazio dei nomi di Python) l'estensione risultante vive.

Ricordate, un pacchetto è sempre una directory (o file zip) contenente un modulo __init__. Per creare un modulo che è un corpo del pacchetto, quel modulo si chiamerà __init__ e vivrà sotto la directory del pacchetto (o zipfile). Non l'ho mai fatto in C; se non funziona direttamente, chiama il modulo ad es. _init invece, e in __init__.py do from _init import * (uno dei pochissimi usi legittimi di from ... import * ;-).