无法指定扩展模块的目的地,无法添加python模块

时间:2014-07-23 19:24:39

标签: python c++ pip cython setup.py

我在NetworKit(https://networkit.iti.kit.edu/)上工作,这是一个混合的C ++ / Cython / Python项目。我想准备setup.py脚本,以便可以通过pip install networkit轻松安装NetworKit。但是,有一些困难。

首先,让我描述一下存储库的目录结构以及setup.py目前的工作原理。

目录结构:

NetworKit/
|- setup.py
|- README.rst
|- MANIFEST.in
|-src/
  |-cpp/
    | c++ header and source files in subfolders
  |-python/
    |- __init__.py
    |- _NetworKit.pyx
    | various python modules

python setup.py develop目前有三件事:

  • 调用SCons来构建C ++核心
  • 在文件夹src/python(需要C ++核心)
  • 中构建扩展模块
  • 在pythonX / dist-packages /中放置一个链接,链接到src/python

以下是setup.py的相关摘录:

if ("install" in sys.argv) :
    build_NetworKit()
src = ["_NetworKit.pyx"]    
modules = [Extension("_NetworKit",
                src,
                language = "c++",
                extra_compile_args=["-fopenmp", "-std=c++11", "-O3", "-DNOGTEST"],
                extra_link_args=["-fopenmp", "-std=c++11"],
                libraries=["NetworKit-Core-{0}".format(optimize)],
                library_dirs=["../../"])]

for e in modules:
    e.cython_directives = {"embedsignature" : True}

setup(name="networkit",
    version="3.2",
    url="https://networkit.iti.kit.edu/",
    keywords = "graph algorithm network analysis social network",
    cmdclass={"build_ext": build_ext},
    ext_modules=modules)

到目前为止我取得了什么成绩: 使用MANIFEST.in我成功地在包中包含了所有C ++头文件和源文件。来自PyPI的测试服务器的python setup.py sdistpip install networkit成功编译了库,创建了扩展并将其放在pythonX/dist-packages/下。这就是问题的开始:

  1. 我希望将扩展名放在pythonX/dist-packages/networkit-x.y/下。此外,虽然它是Extension模块的源,但不会自动包含_NetworKit.pyx;我必须通过MANIFEST.in加入。
  2. 我尝试通过在上面的摘录中将packagespackage_dir添加到setup(...)来添加python模块和子模块。虽然sdist工作并包含了所有.py个文件,但我在安装过程中通常最终会得到directory ... not existing。此外,我尝试调整存储库结构以及setup.py的位置,使其更符合官方建议。但是,这也没有帮助。
  3. 还要总结一下究竟应该安装在哪里:Python模块和子模块以及扩展应该放在pythonX/dist-packages/networkit-x.y/下。

    除了可能不是很合适的目录结构之外,我在setup(...)配置中缺少什么来获得扩展以及正确安装Python模块?

1 个答案:

答案 0 :(得分:1)

首先,您需要distutils setup()关键字package_dir={'':'src/python'}来指示您的python模块的根文件夹,其次您可以使用setuptools函数find_packages(root_dir, include=[], exclude=[])来查找所需的包/模块。因此,您可能希望使用packages=find_packages('src/python')

有关详细信息,请参阅setuptools文档中的here

Setuptools将始终在../site-packages/<packagename>下安装您的软件包。 dist-packages是他们的系统包管理器安装包的debian补充;但是你的python也应该在正确的site-packages文件夹下查找。

如果您希望在开发过程中轻松安装和卸载软件包,我将分别使用pip install -e .pip uninstall -y networkit。有点管理安装允许它也被卸载(所以你可以检查一切正常,等等。)