问题描述
我已经成功构建了一个将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脚本。