如何运行easycython编译生成的Python .pyd或.so扩展文件?
报错原因说明
.pyd是Windows平台的Python C扩展二进制文件,.so是Linux平台的对应Python扩展文件,二者都不属于可直接通过python 文件名执行的纯文本Python脚本。你直接执行二进制文件时,Python解释器会尝试把二进制内容按纯文本源码解析,才会抛出编码类报错。
正确运行方法
C扩展模块的用法和普通Python模块完全一致,核心是导入调用,不能直接执行文件本身,Windows和Linux的操作逻辑基本相同。
Windows环境运行.pyd文件
- 先确认文件命名规范:你生成的
encryption.cp38-win_amd64.pyd的模块名是encryption,后缀的版本、平台标识是Python自动生成的,无需修改 - 将.pyd文件放入Python可检索的路径:可以是当前执行命令的工作目录、Python安装目录下的
site-packages文件夹,或者手动将.pyd所在路径加入sys.path - 两种运行方式可选:
- 编写调用脚本执行:新建纯Python脚本比如
run.py,内容如下,之后执行python run.py即可import encryption # 此处调用原encrypt.py中的入口逻辑即可,比如原脚本入口为main函数就写 encryption.main() - 如果原
encrypt.py写有if __name__ == "__main__"的直接执行逻辑,可以直接用模块方式运行:python -m encryption
- 编写调用脚本执行:新建纯Python脚本比如
Linux环境运行.so扩展文件
操作逻辑和Windows完全一致,仅注意两个差异点:
- 编译生成的扩展文件后缀为.so,命名格式一般为
encryption.cpython-38-x86_64-linux-gnu.so,模块名同样为encryption - 注意给.so文件配置正确的读权限,避免导入时权限不足报错
注意事项
运行扩展使用的Python版本,必须和编译该扩展时使用的Python版本完全一致,比如你这里是Python3.8编译的cp38版本扩展,就不能用Python3.7/3.9等其他版本导入运行。
内容的提问来源于stack exchange,提问作者user3734568
相关产品推荐
相关产品推荐

