python的c ++模块(32bit / 64bit)

时间:2019-03-17 15:42:47

标签: python c++

我已经阅读了以下教程Write c++ extensions并编写了一个简单的函数,但是我使用的是64位linux(并且我不知道如何为python创建32位的监狱),所以我启动了python3 .6 64位并导入了模块,一切正常

实际上,我已经将pybind11编译为64位,并且对于插件而言,相同, 但是所有内容仍然可以使用64位。

但是根据教程

  

使用C ++要求您使用32位Python解释器(建议使用Python 3.6或更高版本)。

那么,如果我可以将扩展名构建和导入为64位,为什么还要使用32位解释器?

在将应用程序构建为可执行文件并包括模块时,这还会引起任何问题吗?

c ++扩展名(Linux下显示的Windows版本是相同的,但使用process_vm_writev而不是WriteProccessMemory):

#include <pybind11/pybind11.h>
#include <iostream>
#include <string>
#include <Windows.h>


int main(char* procID, int address, int newValue) {

    DWORD pID = atoi(procID);
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);


    if (handle == NULL) {
        return 1;
    } else {
        LPVOID mem_addr = (LPVOID)address;
        std::cout << "address: " << address << "\n";
        std::cout << "mem_addr: " << mem_addr << "\n";
        WriteProcessMemory(handle, mem_addr, &newValue, sizeof(newValue), 0);
    }

    return 0;
}

namespace py = pybind11;

PYBIND11_MODULE(c_writter, m) {
    m.doc() = "pybind11 memory writter plugin"; // optional module docstring

    m.def("writter", &main, "A function that writes to process memory");
}

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.12)
project(cnake)

find_package(pybind11 REQUIRED)

if( $ENV{BUILD_TARGET} STREQUAL "linux")
    pybind11_add_module(c_writter lin_source.cpp)
elseif( $ENV{BUILD_TARGET} STREQUAL "windows" )
    pybind11_add_module(c_writter win_source.cpp)
endif()

在Windows上这会生成一个.pyd模块,在Linux上会生成一个.so,并且如果我将该模块导入到Linux上的64位python时,它还可以按预期运行,则我尚未在Windows上对其进行过测试。

0 个答案:

没有答案