改写程序太麻烦?看Python如何直接调用C++程序 !

我们都知道Python是一个“胶水语言”,可以方便地调用其他的Python脚本、应用或其他语言的程序。

 

 

 

 

Python学习交流群:1004391443

 

例如我们可以用一个Python脚本来维护我们关注的合约列表,然后当有新合约出现时(比如生猪、尿素、股指期货期权等等),我们只需要更新这一个合约列表脚本,而非更新各个使用了合约列表的程序:

 

 

 

 

在其他Python脚本中可以这样引用这个合约列表(当文件都在同一目录下时):

 

 

 

 

而对于已经储备了许多C++程序(比如一些高性能的计算模块),又不想花时间将其改写为Python脚本的程序员,该如何用Python调用C++程序呢?

我们可以采用以下步骤:

1、下载gcc

以MinGW为例:

MinGW (Minimalist GNU for Windows)提供了一套简单方便的Windows下的基于GCC 程序开发环境。MinGW 收集了一系列免费的Windows 使用的头文件和库文件;同时整合了GNU ( http://www.gnu.org/ )的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等。MinGW是完全免费的自由软件,它在Windows平台上模拟了Linux下GCC的开发环境,为C++的跨平台开发提供了良好基础支持。

假设系统为win7 X64,下载windows版本 MinGW,下载地址:http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/

下载Download mingw-get-setup.exe (86.5 kB) (注意这是win32 的版本,注意位数应当与已经安装的Python保持一致)

进行安装:

选择默认安装目录 C:\MinGW;

选择安装组件,如果没有出现这个窗口,点击快速启动栏,点击MinGW Installation Manager,一定选上安装The GUN C++ Compiler和The GUN Objectiv-C Compiler。

完成之后退出,将C:\MinGW\bin 添加到环境变量。设置完成后,Windows似乎不会自动更新环境变量,除非重启机子,那么我们可以通过在下面的命令行中,设置一下PATH(比如SET PATH=C:\),然后退出命令行,那么系统环境变量就会被强制刷新。

点击cmd,输入 g++ --version 可以查看编译器版本,则说明MinGW安装成功。

 

 

 

 


 

2、编译C++

新建一c++文件:如test1.cpp(这个简单的例子只是输入两个数字,再打印出来)

 

 

 

 

在cmd窗口中进入该文件所在目录,输入:

g++ -o test1.so -shared -fPIC test1.cpp

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件。

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

会生产一个test1.so 动态链接库文件。

用户应注意使用这个方法在windows下编译的so动态链接库文件不能直接在linux下调用。想在linux中调用so文件,需要在linux环境下进行编译。


3、Python调用C++

在Python脚本里添加

 

 

 

 

其中ctypes是Python的一个库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数。

运行以上脚本得到:

 

 

 

 

显示调用C++程序成功。

采用这个方法,我们不用进行大量的改写,也能在Python中使用我们积累的各种C++程序了。

以下是将根据输入的某年某月某日判断是打鱼还是晒网的程序改写成的 C++ 语言代码: ```cpp #include <iostream> using namespace std; // 判断是否为闰年 bool isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 获取指定月份的天数 int daysInMonth(int year, int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return isLeapYear(year) ? 29 : 28; default: return 0; } } // 计算该日期是该年的第几天 int dayOfYear(int year, int month, int day) { int totalDays = 0; for (int i = 1; i < month; i++) { totalDays += daysInMonth(year, i); } totalDays += day; return totalDays; } // 判断是打鱼还是晒网 string fishingOrDrying(int totalDays) { int remainder = totalDays % 5; switch (remainder) { case 1: case 2: case 3: return "打鱼"; case 4: case 0: return "晒网"; default: return ""; } } int main() { int year, month, day; cout << "请输入年份: "; cin >> year; cout << "请输入月份: "; cin >> month; cout << "请输入日期: "; cin >> day; int totalDays = dayOfYear(year, month, day); string status = fishingOrDrying(totalDays); cout << year << "年" << month << "月" << day << "日是" << status << endl; return 0; } ``` ### 代码解释 1. **`isLeapYear` 函数**:用于判断给定年份是否为闰年,根据闰年的判断规则,如果年份能被 4 整除且不能被 100 整除,或者能被 400 整除,则为闰年。 2. **`daysInMonth` 函数**:使用 `switch` 语句根据年份和月份返回该月的天数,对于 2 月,会根据是否为闰年返回 28 或 29 天。 3. **`dayOfYear` 函数**:计算输入日期是该年的第几天,通过遍历每个月并累加天数,最后加上输入的日期。 4. **`fishingOrDrying` 函数**:根据总天数除以 5 的余数,使用 `switch` 语句判断是“打鱼”还是“晒网”。 5. **`main` 函数**:获取用户输入的年份、月份和日期,调用上述函数计算总天数并判断状态,最后输出结果。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值