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

标签 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 目前做了 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/。这是问题开始的地方:

  1. 我希望将扩展放在 pythonX/dist-packages/networkit-x.y/ 下。此外,虽然 _NetworKit.pyx 是扩展模块的源代码,但它不会自动包含在内;我必须通过 MANIFEST.in 包含它。
  2. 我尝试通过将 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') .

参见 here在 setuptools 文档中获取更多信息。

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/

相关文章:

python - 为什么 pip search 找不到某些软件包,而它们仍然可以通过 pip install 安装

python - 我可以防止 pip 隐式降级软件包吗?

python - 构建成功后 pip 不删除源

python - 在 Python 中更新字典值

c++ - 我遇到了复制构造函数错误,但不知道我对这个错误的想法是否正确

c++ - 如何使父类不重复已执行的祖父方法

c++ - 如何从Qt中的项目中排除cpp文件

python - pyqt5 - 关闭/终止应用程序

python - 抑制单元测试中的补充错误消息

python - 用给定均值截断正态分布