一种情况是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。
安装之后重启一下电脑再试试。