如何安装CMake+pybind11生成的.so文件并在Python3中导入?
解决预编译pybind11扩展的安装问题
你的setup.py存在几个关键问题,导致无法正常安装,以下是修正方案和正确的安装调用步骤:
问题分析
packages=['']无效,setuptools无法识别空字符串作为包名package_data指定的pow包不存在,且路径使用~无法被setup正确解析- 预编译的
.so文件需要被放置到Python能识别的模块路径中
方案一:直接安装到site-packages(最简单)
修改setup.py为以下内容,注意替换成pow.so的绝对路径(不要用~):
from setuptools import setup import sysconfig setup( name='pow', version='0.1', author="Nobody", description="Install precompiled pybind11 extension", # 将.so文件安装到Python的site-packages目录 data_files=[(sysconfig.get_path('purelib'), ['/home/你的用户名/Desktop/pybinmod1/pow.so'])] )
安装与调用
- 执行安装命令:
pip install .
- 在Python代码中直接导入调用:
import pow print(pow.your_function_name()) # 替换成你实际的C++函数名
方案二:创建包结构(规范方式)
如果想以包的形式管理,先创建如下目录结构:
pow_ext/ ├── __init__.py └── pow.so
其中__init__.py可以是空文件,也可以添加导入语句简化调用:
# __init__.py from .pow import *
然后编写setup.py:
from setuptools import setup, find_packages setup( name='pow_ext', version='0.1', author="Nobody", description="Precompiled pybind11 extension package", packages=find_packages(), package_data={'pow_ext': ['pow.so']} )
安装与调用
- 执行安装命令:
pip install .
- 在Python中调用:
# 方式1 import pow_ext.pow print(pow_ext.pow.your_function_name()) # 方式2(如果__init__.py添加了导入语句) import pow_ext print(pow_ext.your_function_name())
注意事项
- 确保
pow.so与你的Python版本、系统架构完全兼容(比如同为64位,Python版本匹配) - 安装时如果遇到权限问题,可添加
--user参数(pip install . --user),安装到当前用户的site-packages目录
内容的提问来源于stack exchange,提问作者Mohammad Hassan Rezaei
相关产品推荐
相关产品推荐

