autohotkey和python混合编程

一种情况是autohotkey直接运行python程序,另一种情况是调用python的dll文件。

但是python作为一种解释型的脚本语言,本身是不能直接编译生成动态库的,为了生成动态库,我们需要借助cpython将python脚本变成c语言文件。

1.首先定义一个python函数,

def str_add(str1, str2):
    return int(str1) + int(str2)

2.将其保存为run.py,这个python脚本。

但是因为要使用cpython进行编译,所以也需要保存成cpython版本的函数:

cdef public str_add(str1,str2):
         return int(str1) + int(str2)

和前面的python版本相比,cdef替换了def,并在函数名之前加上了public关键字,表示这个函数要导出,将这个代码保存成pyx文件,比如run.pyx

然后在命令行里面将这个函数来变成c语言版本

可以看到,多了两个文件,一个.c文件,另一个是.h文件。这个两个文件,可以通过调用python的C-API实现run.py代码的功能。

接下来编写动态库的主文件,dllmain.c

#include <Python.h>
#include <Windows.h>
#include "run.h"
 
extern __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b) {
    return PyLong_AsLong(str_add(PyUnicode_FromString(a),PyUnicode_FromString(b)));<br>
}
 
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) {
    switch( fdwReason ) {
        case DLL_PROCESS_ATTACH:
            Py_Initialize();
            PyInit_run();  #dll初始化的时候调用,这是python3的写法,python2改成,initrun()。参见生成的run.h
            break;
        case DLL_PROCESS_DETACH:
            Py_Finalize();
            break;
    }
    return TRUE;
}

然后下面通过如下命令,将这个代码编译成dll文件。

cl /LD dllmain.c run.c -ID:\Program\Anaconda3\include D:\Program\Anaconda3\libs\python37.lib

这里python的路径,根据不同电脑python的安装位置,做相应调整。

若是出现了cl不是内部或者外部命令,也不是可运行的程序或批处理文件,那么检查一下自己是否安装了visual studio。

安装之后重启一下电脑再试试。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值