2017-02-05 40 views
-1

我寫了一個Python庫有兩個部分:如何打包Python C擴展,使其成爲普通Python模塊的子模塊?

  1. 一個Python C擴展
  2. 一個Python包裝的Python的C擴展

我希望能夠在這樣一個將它打包Python封裝器是頂級模塊foo,Python C擴展器是位於foo._foo的子模塊。不過,我至今只能創建兩個頂級模塊foo_foo

我需要做什麼在setup.pyinit_foo C函數爲了完成這個?

(我的問題是精妙從this不同)


當前目錄結構:

foo/ 
    foo/ 
     __init__.py 
    foo.c 
    setup.py 
    tests.py 

setup.py看起來像:

from distutils.core import setup, Extension 

module = Extension('_foo', 
        sources=['foo.c']) 

setup(name='foo', packages=['foo'], ext_modules=[module]) 

foo.c看起來像:

PyMODINIT_FUNC init_foo(void) { 
    PyObject *m; 
    m = Py_InitModule("_foo", FooMethods); 
    // .. 
} 
int main(int argc, char *argv[]) { 
    Py_SetProgramName(argv[0]) 
    Py_Initialize(); 
    init_pychbase(); 
} 

foo/__init__.py看起來像:

from _foo import _Foo, _Bar, _Baz 

class Foo(object): 
    def __init__(self): 
     self._foo = _Foo() 
+0

@MatthewMoisen你說:「(我的問題是從[這裏]微妙不同(http://stackoverflow.com/questions/12097755/how-to -build-a-python -c-extension-so-i-can-import-it-from-a-module))「你能解釋一下爲什麼嗎? – MSeifert

+0

@MSeifert在接受了另一個嘗試之後,我現在意識到這並不足以證明一個新問題。 (不同之處在於我希望將我的c擴展名更深一層,而OP則希望他的兩級更深)。我的問題是我的'tests.py'文件和foo模塊位於同一個目錄,所以當我運行它時導入是關閉的。創建一個'tests/tests.py'安裝程序解決了這個問題。 –

回答

0

如鏈接的問題提到的,解決的方法就是改變_foofoo._foo

from distutils.core import setup, Extension 

module = Extension('foo._foo', 
        sources=['foo.c']) 

setup(name='foo', packages=['foo'], ext_modules=[module]) 

我的問題是,我跑我的tests.pyfoo模塊位於同一目錄中。

我解決了這個問題通過將它自己的目錄中:

/foo 
    /foo 
     __init__.py 
    foo.c 
    setup.py 
    /tests 
     test.py