不单独使用python软件包安装共享库

问题描述

我已经成功构建了一个将CMake与pybind11结合使用的Python包,以创建共享对象(.so-假设目前仅使用Linux)文件。该实现有效,但是我无法使用pip uninstall .

删除此共享库文件

我在setup文件中的setup.py命令看起来像是从pybind/cmake_example存储库中提取的:

setup(
    name='package',version='0.0.1',author='-',author_email='-',description='A test project using pybind11 and CMake',long_description='',ext_modules=[CMakeExtension('packagebindings')],cmdclass=dict(build_ext=CMakeBuild),zip_safe=False,packages=setuptools.find_packages()
)

我的CMakeLists.txt文件包含一条install指令,如下所示:

install(TARGETS packagebindings COMPONENT python LIBRARY DESTINATION ${Python_SITELIB})

总结一下,这是运行pip install .时创建的文件

  • path/to/site-packages/package/*-已由pip uninstall package
  • 删除
  • path/to/site-packages/package-0.0.1.dist-info/*-已由pip uninstall package
  • 删除
  • path/to/site-packages/packagebindings.cpython-37m-x86_64-linux-gnu.so-在pip uninstall package之后仍然存在

我想知道如何制作它,以便运行pip uninstall .删除.so文件

如果需要进一步的MRE,我可以链接到存储库。

解决方法

您的CMake安装目标似乎将.so直接放置在python安装目录(DESTINATION ${Python_SITE_LIB})中。我猜测这会阻止.so被Python正确注册,因此在卸载时不会将其删除。我建议使CMake将.so放在分发目录中,然后将以下选项添加到setup()

data_files = [("installation_bin",["distribution_bin/library.so"])]

这将使Python包管理器跟踪.so。第一个字符串是相对于安装前缀的目录。第二个字符串是您发行版中的.so文件,相对于setup.py脚本。