带有C扩展的Python项目 - 结构,导入和测试

时间:2015-02-19 22:29:11

标签: python c python-2.7 import directory-structure

用python编写的带有一些C扩展的项目(不使用SWIG等)。我试图找出如何构建我的项目,以便:

  1. 进口工作。导入共享对象
  2. 我不需要改变PYTHONPATH(尝试搞清楚并失败了)。
  3. 将来,分发项目包将是最简单的。
  4. 目前的结构如建议的那样here

    Project\
    
        docs\  # mainly documentation, right?
    
        bin\   # empty
    
        setup.py # setup for the project, as suggested in the above link
    
        project\   
            __init__.py
            module.py
    
            tests\
                 bla_test.py
    
        C\ # the package of C files
            file.c
            file.so
            other_c_stuff.c
            header.h
            setup.py # setup to compile the C files and create .so files
            build\ # contaisn a bunch of (hopefully) irrelevant stuf
    

    它来自PyDev,但不是来自shell。理想的答案将解决以下问题:

    1. 项目的建议结构。
    2. 如何进行导入(例如,来自tests中的模块)。
    3. 我应该(可以)将所有C文件保存在一个单独的库中吗?
    4. C文件的构建是在setup.py个文件中完成的(我应该在这里发帖吗?)
    5. 是否可以在必要时自动构建?怎么样?
    6. 我试过relative imports - 他们因某些原因不能为我工作。 我看到了接受this问题的答案。他说 - 做任何事。但我无法让进口工作。我读了this回答,但不知道他拥有的所有东西(我没有)。接受的答案对我没有帮助,因为再次进口失败了。 This博客文章提供了很好的建议,但同样是进口!

1 个答案:

答案 0 :(得分:1)

我不想详细说明一般答案,因为你已经把好的答案联系好了。

一些适合你的结构可能看起来像:

Project\

    build\ # directory used by setup.py

    docs\  # mainly documentation, right?

    setup.py # setup for the project, as suggested in the above link

    project\   
        __init__.py
        module.py

        c_package\
            __init__.py
            file.c
            file.so
            other_c_stuff.c
            header.h

        tests\
            __init__.py
            test_bla.py

所以在project包及其子包中,你可以使用相对导入,如果你在地方构建C Extensions

python setup.py build_ext --inplace

或创建包含

setup.cfg
[build_ext]
inplace=True

但仅用于开发而不释放它,因为安装将失败。

构建自动化是可能的,但除了C源已更改之外,我不知道除了直接调用setup.py之外的任何其他内容。