python编译pyd后程序无法运行

目前碰到两个比较坑的地方,记录一下。

1.指定返回值

如以下代码段

def str_test() -> str:
    return 10

python在运行的过程中,虽然我们指定了返回值类型,但是即使我们返回的是与返回值类型截然不同的类型,也不会抛出异常。但是当你编译成pyd以后,就会发生错误。究其原因,还是因为编译的过程是先把python语言转换成c语言,但是c语言对返回值类型是有严格规定的,虽然可以编译成功,但是运行过程中有可能出现无法排查到的错误,特别是没有添加日志打印的情况下,更加难以排查。

2.编译器位置参数

def deco(test):
    def get_func(func):
        def get_param(*args, **kwargs):
            print("-------deco----------")
            ret = func(*args, **kwargs)
            print(test)
            return ret
        return get_param
    return get_func


@deco(test='test is test')
def str_test(test2):
    print(test2)
    return 10


str_test(test2='test is test2')

又是一个踩坑的地方。在python中,这样的表达形式是完全没有问题的,但如果我们编译成pyd,pyd可以识别str_test中的关键字参数,却无法正确识别deco中的关键字参数。这可能也会导致抛出一些不易察觉的异常,特别是没有打印的情况下。解决方案就是不要使用关键字参数,使用位置参数传参即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,有两种方法可以创建 C/C++ 扩展模块,一种是使用 ctypes 库将 C/C++ 代码封装为 Python 模块,另一种是使用 Python 的 C API 构建 Python 模块。 如果你想使用 Python 的 C API 构建 Python 模块,那么可以使用以下步骤编译 pyd 文件: 1. 编写 C/C++ 扩展模块的代码,并将代码保存为 .c 或 .cpp 文件。 2. 使用 Visual Studio 或者 GCC 等编译器将 C/C++ 代码编译成动态链接库(DLL)或共享对象(SO)文件。 3. 在编译时链接 Python 库文件和头文件。 4. 将生成的 DLL 或 SO 文件重命名为 pyd 文件。 下面是一个示例代码: ```c++ #include <Python.h> static PyObject* example(PyObject* self, PyObject* args) { // 实现扩展模块的逻辑 return Py_BuildValue("s", "Hello, World!"); } static PyMethodDef exampleMethods[] = { {"example", example, METH_VARARGS, "example function"}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef exampleModule = { PyModuleDef_HEAD_INIT, "example", "example module", -1, exampleMethods }; PyMODINIT_FUNC PyInit_example(void) { return PyModule_Create(&exampleModule); } ``` 上面的代码实现了一个名为 example 的函数,并将其作为 Python 模块的一部分导出。如果你使用 Visual Studio 编译器,可以使用以下命令编译该代码: ``` cl /LD /I C:\Python38\include example.c /link /LIBPATH:C:\Python38\libs python38.lib ``` 这将在当前目录下生成 example.dll 文件。你可以将其重命名为 example.pyd 文件,然后将其导入到 Python 代码中使用。 注意:在编译时需要根据你的 Python 版本和安装路径设置头文件、库文件、链接库等相关参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值