我致力于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当前执行3件事:
  • 调用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/下。这是问题开始的地方:
  • 我希望将扩展名放在pythonX/dist-packages/networkit-x.y/下。另外,尽管_NetworKit.pyx是扩展模块的源,但它不会自动包含在内。我必须通过MANIFEST.in包含它。
  • 我尝试通过在上面的摘录中将packagespackage_dir添加到setup(...)中来添加python模块和子模块。尽管sdist起作用并包含了所有.py文件,但在安装过程中我通常以directory ... not existing结尾。另外,我尝试调整存储库的结构以及setup.py的位置,使其更符合官方建议。但是,这也无济于事。

  • 还总结了确切应该安装在什么位置:Python模块和子模块以及扩展应该在pythonX/dist-packages/networkit-x.y/下。

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

    最佳答案

    首先,您希望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。通过pip管理安装,也可以将其卸载(因此您可以检查一切是否正常,等等)。

    关于python - 无法指定扩展模块的目的地,无法添加python模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24919189/

    10-11 23:05
    查看更多