gpt4 book ai didi

python - 操作系统 X : python ctypes global variables

转载 作者:行者123 更新时间:2023-11-30 17:14:26 27 4
gpt4 key购买 nike

我正在尝试创建与使用 C99 标准编写的项目的 Python ctypes 绑定(bind)。当前的 C 代码使用一些全局变量(例如 bcd)以及顶级函数(例如 >mod_run)。

示例:model.c

#include <mod_def.h>
#include <mod_run.h>

struct_b *b;
int d

int
mod_run(int rec,
double state,
struct_a *a)
{
extern struct_c c;

// code that uses a, b, c, d, rec, state
// and functions defined in mod_def.h and mod_run.h

}

我已使用setuptools.extension模块成功创建了共享对象(例如model.so),但无法使用ctypes加载该对象.cdll.LoadLibrary

In [1]: from ctypes import *

In [2]: cdll.LoadLibrary('model.so')

OSError: dlopen(model.so, 6): Symbol not found: _X
Referenced from: model.so
Expected in: dynamic lookup

其中X是在mod_def.h中声明的全局变量:

extern size_t X;

最后是我的问题。我是否需要创建一个围绕 mod_run 的包装器,以允许我导出示例代码中定义的每个全局变量?或者是否可以以某种方式加载共享对象,而无需定义 X

我已经查看了这些相关主题,但没有找到任何可以解决我的问题的内容:

更新(2015 年 5 月 20 日):

我如何构建共享对象:

setup(name='model',
...
ext_modules=[Extension(
'model',
sources=sources, # list of c sources using absolute paths
include_dirs=includes, # list of include directories using absolute paths
extra_compile_args=['-std=c99'],
# extra_link_args=['-lmodule_with_globals'] # does not build with this option: ld: library not found for -lmodule_with_globals
)])

使用 OSX 10.10.3 和 Python 3.4.3::Anaconda 2.2.0 (x86_64)。

最佳答案

问题在于变量 X 是在头文件中定义的,但从未在代码中的任何位置分配。 外部 size_t X;

为了解决这个问题,我创建了一个名为 globals.c 的包装文件,并在其中简单地说:

// globals.c
#include <mod_def.h>
#include <mod_run.h>

size_t X;
// allocation of other global variables

就这样,

from ctypes import *
# load the library (this was failing before)
lib = cdll.LoadLibrary('model.so')

# create a python variable that maps to the global X
X = c_sizet.in_dll(lib, 'X')
# assign a value to the global X
X.value = 2

分配可能位于现有源文件之一的 header 中,但就我而言,这就是我们现在希望模块工作的方式。

关于python - 操作系统 X : python ctypes global variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com