【问题标题】:Installing shared library with python package not separately不单独使用 python 包安装共享库
【发布时间】:2021-02-02 15:27:49
【问题描述】:

我已经成功构建了一个 Python 包,它使用 CMake 和 pybind11 来创建共享对象(.so - 假设目前仅使用 Linux)文件。该实现有效,但我无法使用 pip uninstall . 删除此共享对象文件

我在setup.py 文件中的setup 命令看起来像这样取自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 安装目录中是否正确?这可以解释它没有被移除的原因。
  • 这就是我正在做的事情——我想我希望目标目录位于 ${CMAKE_BINARY_DIRECTORY} 或类似的地方

标签: python c++ cmake pip pybind11


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答,我现在试试这个并回复您
猜你喜欢
  • 2019-02-03
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多