我致力于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件事:src/python
(需要C++内核)中构建扩展模块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 sdist
和pip install networkit
成功编译了库,创建了扩展并将其放在pythonX/dist-packages/
下。这是问题开始的地方:pythonX/dist-packages/networkit-x.y/
下。另外,尽管_NetworKit.pyx是扩展模块的源,但它不会自动包含在内。我必须通过MANIFEST.in
包含它。 packages
和package_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/