一种情况是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

python 调用 autoit autohotkey调用python_python

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

python 调用 autoit autohotkey调用python_动态库_02

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

python 调用 autoit autohotkey调用python_动态库_03

接下来编写动态库的主文件,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。

python 调用 autoit autohotkey调用python_python 调用 autoit_04

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