当前位置: 首页 > 知识库问答 >
问题:

pybind11与GetModuleFileName冲突

易京
2023-03-14

我使用pybind11让python调用现有的C模块(库)。但是,在C库中,调用::GetModuleFileName(Visual Studio)来确定加载的模块在C中运行时的物理路径。但是当我通过pybind11从python(Jupyter Notebook)调用库时,python.exe的物理路径会返回。如何配置或更改以确保获得C库的物理路径?

C代码是这样的:Lib. h

#pragma once

void run();

我ib.cpp

#include <fstream>
#include <stdexcept>

#include <windows.h>
#include "libloaderapi.h"

#include "Lib.h"

void run()
{
    char buf[1024];
    ::GetModuleFileName(0, buf, sizeof(buf));

    std::ofstream of;
    of.open("logging.txt");

    if (!of.is_open()) {
        throw std::runtime_error("Cannot open logging.txt");
    }

    of << "The loaded module is " << buf << std::endl;
}

pybind11接口代码:Direct.cpp

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>

#include "Lib.h"

namespace py = pybind11;

// wrap c++ function
void wrapper() {
    run();
}

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

    m.def("run", &wrapper, "Run C++ Application");
}

pybind11安装文件:setup.py

#from distutils.core import setup, Extension
#from distutils import sysconfig

from setuptools import setup, Extension
import pybind11

# The following is for GCC compiler only.
#cpp_args = ['-std=c++11', '-stdlib=libc++', '-mmacosx-version-min=10.7']
cpp_args = []

sfc_module = Extension(
    'run_app',
    sources=['Direct.cpp', 
             'Lib.cpp'],
    include_dirs=[pybind11.get_include(), '.'],
    language='c++',
    extra_compile_args=cpp_args,
    )

setup(
    name='run_app',
    version='1.0',
    description='Python package with RunApp C++ extension (PyBind11)',
    ext_modules=[sfc_module],
)

建立:

python设置。皮包

调用这个库的python代码:py_run_app.py

import os
import sys
sys.path.append(os.path.realpath('build\lib.win-amd64-3.7'))

from run_app import run
run()

运行后:

python py_run_应用程序。派克

在日志中。txt加载的模块是C:。。。。\蟒蛇。exe

我想看到的是模块的物理位置。

共有1个答案

曾嘉荣
2023-03-14

Windows术语中的“模块”是加载为进程一部分的DLL或可执行文件。每个模块都有一个模块手柄;按照惯例,特殊句柄NULL表示用于创建进程的可执行文件。

GetModuleFileName要求模块句柄作为第一个参数。如果传递0,则返回具有特殊句柄NULL的模块名称,即可执行文件。这是完全可以预料的。

为了获得DLL的文件名,您需要找出它的句柄是什么。可以找到当前模块的句柄:

HMODULE handle;
static char local;
bool ok = GetModuleHandleEx (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
                             (LPCSTR)&local,
                             &handle);

local可以是当前模块中的任何函数或静态/外部变量。裁判。

 类似资料:
  • pybind11 可实现 C++11 和 Python 之间的无缝操作。 pybind11 是一个轻量级的只包含一组头文件的 C++ 库,可以在 Python 中使用 C++ 类型。主要用于创建已有 C++ 代码的 Python 封装版本。其目的和语法类似于 Boost.Python 库。为什么要创建这个项目的原因就是因为 Boost 。作者认为 Boost 很大很复杂。而目前的 C++11 兼容

  • 我使用的是Horizontal ViewPager2,它里面有4个片段。每个片段都有一个回收器视图上的SwipeReFresLayout。我面临的问题是,当回收器视图位于顶部时,然后onClick on任何项目列表都不起作用。如果我向下滚动一点回收器视图,那么onClick就可以正常工作。当回收器视图位于顶部时,如果SwipeReFresLayout处于刷新状态,那么onClick就可以正常工作。

  • 有了这个Jaxb Xml定义,我尝试通过添加来移除映射元素包装器,但在解压缩过程中会导致异常 EventAdapter是 我的输出是 我尝试通过添加来删除标记 产量不错 但撤退失败了 调试Jaxb使我熟悉了这一行

  • 我想使用Stetho调试了我的Andorid应用程序,但Stetho与Fastjson有冲突。

  • Postgres 10和11的插入说明: 关于冲突[冲突目标]冲突行动 我有一张桌子: 而我想做的 但是我得到一个错误: ON CONFLICT DO UPDATE需要推理规范或约束名称提示:例如,ON CONFLICT(column_name) 为什么我必须提供一个确定的目标?如何提供主键或其他列集?

  • 问题内容: 我有以下代码: 这正常工作。但是,我还需要在pom.xml中添加Xalan作为依赖项,当我这样做时,上面的代码现在会引发错误: 我认为这与Xalan的jar中有一个不同的Transformer实现有关。在不更改上述代码并将Xalan保留为依赖关系的情况下,如何解决此冲突? 问题答案: 从Xalan中排除Xerces可以解决此问题: