python写成py文件经过处理转化成pyx文件,以及函数说明文件pyi使用pyrexc.py编译成对应模块的c和h文件

然后写一个main的cpp文件,使用cmake产生vs工程,使用incredBuild编译工程。

以下是一个实例:

python原脚本,功能是更改目录下hcpp文件的修改时间,本地调试修改时间之后导致代码编译时间戳错乱,故写了一个py脚本

#!/bin/python

#coding=gbk

import sys,os,time,re

def walk_dir(dir):

timenow = time.time()

ncntnum = 0

for root, dirs, files in os.walk(dir, True):

for name in files:

filename = os.path.join(root,name)

mat = re.search('[.](h|cpp|c|hpp)',filename)

if mat:

filechgtime = os.path.getmtime(filename)

if filechgtime > timenow:

os.utime(filename,(timenow,timenow))

print '已修改:',filename

ncntnum += 1

print '修改数:',ncntnum

if __name__ == '__main__':

if len(sys.argv) < 2:

print '添加参数:目录'

else:

walk_dir(sys.argv[1])

文件名为chgFileTM.py,直接拷贝为chgFileTM.pyx,将pyx文件修改如下:

#!/bin/python

#coding=gbk

import os,time,re

def walk_dir(dir):

timenow = time.time()

ncntnum = 0

for root, dirs, files in os.walk(dir, True):

for name in files:

filename = os.path.join(root,name)

mat = re.search('[.](h|cpp|c|hpp)',filename)

if mat:

filechgtime = os.path.getmtime(filename)

if filechgtime > timenow:

os.utime(filename,(timenow,timenow))

print '已修改:',filename

ncntnum += 1

print '修改数:',ncntnum

cdef public void c_walk_dir(char* pfir):

try:

walk_dir(pfir)

except Exception , e:

print e

添加一个pyrex格式的函数实现,调用+异常

chgFileTM.pyi文件,函数说明:

cdefexternvoid(c_walk_dir(char*pfir))确认python安装了pyrex

执行pyrexc.py chgFileTM.pyx

生成了chgFileTM.h以及chgFileTM.c,如果提示错误的话一般是pyx文件空格和tab混用报错,直接用4个空格替换所有tab就行

可以参考下函数的调用,test.cpp

#include "chgFileTM.h"

#include

#include "Python.h"

#include "structmember.h"

int main(int argc, char *argv[])

{

if(argc <= 1)

{

std::cout<

return 1;

}

try

{

Py_Initialize();

initchgFileTM(); // 这个地方的函数名字为init加上模块名,就是原来那个py文件的名字

c_walk_dir(argv[1]);

Py_Finalize();

}

catch(...)

{

std::cout<

}

return 0;

}

ps:pyrex的默认处理有问题,编译获得的.h文件不包含#include "Python.h"的引入定义,可以手动修改.h文件也可以修改pyrex的源代码,都是python代码,修改位置如下:

python安装目录\Lib\site-packages\Pyrex\Compiler\ModuleNode.py

generate_extern_c_macro_definition函数下面添加

def generate_python_h_include(self, code):

code.putln('#include "Python.h"')

generate_h_code函数,self.generate_extern_c_macro_definition(h_code)下面添加self.generate_python_h_include(h_code)

OK了,如果执行错误,那还是空格和tab的问题,替换下就行,再次执行

yrexc.py chgFileTM.pyx

目前:代码准备工作已经完成,剩下的就是自动编译的问题了

考虑下我们的编译平台,下载python源代码,发现windows下的编译是用的vs,我用的是vs2008,选择9.0版本

编译python版本,只要是主要的文件python pythonw工程,采用release版本吧,得到python的dll及lib等文件

把编译获得的dll及lib文件拷贝到python安装目录的libs及dlls等目录,将python的dlls目录添加到path路径

自动编译采用cmake

incredBuild,要不然自己写cl的编译脚本,比较麻烦

好,编译环境的问题解决了,上我写的自动化脚本

#!D:/GNU/MSYS/bin/sh.exe

#edit cmake

if [ $# != 1 ] ; then

echo "USAGE: cmake.sh proj"

exit 1;

fi

makefilelist=CMakeLists.txt

PROJECT_NAME=$1

FILE_NAME=`ls *.[ch]*`

rm -f $makefilelist

#工程设置

echo -e 'PROJECT(' $PROJECT_NAME ')' '\n' >> $makefilelist

#不用修改设置

echo -e 'SET(VC9_DIR $ENV{VC9_DIR})' '\n'\

'SET(PYTHON_DIR $ENV{PYTHON_DIR})' '\n'\

'SET(CMAKE_C_COMPILER "${VC9_DIR}/bin/cl.exe")' '\n'\

'SET(CMAKE_CXX_COMPILER "${VC9_DIR}/bin/cl.exe")' '\n'\

'SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}")' '\n'\

'include_directories ("${PYTHON_DIR}/include" )' '\n'\

'link_directories ("${PYTHON_DIR}/libs" "${PYTHON_DIR}/Lib" )' '\n' >> $makefilelist

#库和exe设置

echo -e 'add_executable('$PROJECT_NAME $FILE_NAME') \n' >> $makefilelist

#执行脚本

rm -fr build

mkdir build

cd build

echo 'start cmake'

cmake -G "Visual Studio 9 2008" ..

echo 'start build'

echo -e BuildConsole.exe $PROJECT_NAME /build /cfg=\"Release\|Win32\" '\n'\

rm -f ../$PROJECT_NAME.exe '\n'\

cp Release/$PROJECT_NAME.exe ../$PROJECT_NAME.exe '\n'\

pause '\n'\

exit > build.bat

start build.bat

cd ..

#删除脚本

rm -f $makefilelist

使用的是MSYS的shell模拟器执行,如果没有可以考虑安装一下,使用的时候

sh cmake.sh 工程名,直接指定了完成的exe的文件名

一般能自动完成,如果不能,使用vs2008手动编译下看看

比如执行sh cmake.sh chgFileTM

在目录得到chgFileTM.exe

现在直接执行是没问题的,但是离开了拥有python的机器就不行了

拷贝python安装目录DLLS目录下的文件到没安装上的机器就行了

当然要是想简单的话写个打包工具也可以

以上仅仅是windows的做法,在linux,基本都有python,直接的执行效率也不错,觉得也没必要制作打包工具了。

python3怎么使用pyrex_python pyrex windows 编译C可执行文件相关推荐

  1. OGRE 2.1 Windows 编译

    版权所有,转载请注明链接 OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE ...

  2. DCNv2 windows编译2021

    2019年曾经写过一篇DCNv2 windows编译的博客 https://blog.csdn.net/jacke121/article/details/91355170 当时vs2015是编译成功的 ...

  3. Cef mysql.exe_CEF3.2623使用记录:windows编译

    CEF3.2623使用记录:windows编译 1:cef3.2623下载地址 2623是cef3最后一个支持xp系统的版本,且可以支持html的audio标签,可以用作对html音频的处理下载地址为 ...

  4. fastdfs windows部署_Go在windows下编译Linux可执行文件

    欢迎关注我的头条号:Wooola,专注于Java.Golang.微服务架构,致力于每天分享原创文章.快乐编码和开源技术. 前言 最近楼主做了一个滑块验证码登录功能,但有个问题,悲观估计一天大约会产生两 ...

  5. LibreCAD for windows 编译

    LibreCAD for windows 编译 项目中要用到平面CAD功能,找到libreCAD,发现不很适合需求,需要重新改造一下:)要改造就要编译: 1.下载源码解压到H盘 2.用notepad+ ...

  6. FreeRDP 2.0 for Windows 编译

    简介 Freerdp 一个开源的RDP跨平台客户端: https://github.com/FreeRDP/FreeRDP 版本 2020-04-09 Github上其发布了2.0版本: 只下载其re ...

  7. Windows编译FreeRDP

    Windows编译FreeRDP 需要准备的工具 1.安装CMake (cmake-gui) 2.安装`Visual Studio Community 2017` 3.下载`FreeRDP`源码 4. ...

  8. windows编译g20问题解决记录

    windows编译g20问题解决记录 error C3861: 'vasprintf': identifier not found 参考链接 here

  9. Windows编译安装AzerothCore魔兽世界开源服务端Lua脚本引擎Eluna和防作弊anticheat模块教程

    Windows编译安装AzerothCore魔兽世界开源服务端Lua脚本引擎Eluna和防作弊anticheat模块教程 大家好,我是艾西今天和大家聊聊魔兽世界游戏内的脚步以及防作弊模块 Eluna是 ...

最新文章

  1. python3 _笨方法学Python_日记_DAY3
  2. Matlab编程与数据类型 -- 文本M文件
  3. 日常办公会用到的python模块-用 Python 自动化办公能做到哪些有趣或有用的事情?...
  4. 用数据挖掘来支持音乐创作
  5. 【python】使用plt.imshow(image)显示图片一片空白,像素值有数据
  6. openresty capture
  7. 搭建ssh框架的步骤
  8. 纽曼皮尔逊准则Matlab实现,纽曼-皮尔逊准则,Neyman Pearson Criterion,在线英语词典,英文翻译,专业英语...
  9. 【贪心算法】POJ-1017
  10. Express是Node.js上最流行的Web开发框架。
  11. 使用telnet命令测试网络时连接建立后无法退出解决办法
  12. 特征码的使用办法_小脚的美丽与哀愁,34/35码的她们都是怎么买鞋的?
  13. Struts2基础教程
  14. 局域网打印机共享怎么设置_一篇文章弄懂局域网打印机共享
  15. 腾讯CDC标叔的十年交互设计感悟-20141117早读课
  16. 给redis设置密码
  17. 华为手机怎么连接电脑传输
  18. UE风格化Day9-(摆烂特辑)原神石块砖材质欣赏
  19. 第一章:电商及商品系统概述
  20. 获取中国银行网页中外汇率

热门文章

  1. 18位身份证验证(Java)
  2. 201521460005 实验五
  3. bzoj4514: [Sdoi2016]数字配对(费用流)
  4. 在.Net Core中使用Swagger制作接口文档
  5. 【转载】Delphi获取与设置系统时间格式(长日期与短日期)
  6. apache+php+mysql服务器搭建
  7. DeleteDC、ReleaseDC、DeleteObject - [Daliy APIs]
  8. MySQL主从复制原理(原理+实操)
  9. Redis常见配置介绍
  10. 【Linux】swap分区简介及空间增加方式