- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Python API 用 C 编写程序。
Python 将输入(结构)传递给 C 程序,C 程序将根据输入执行一些操作。
谁能告诉我是否可以在 Python 和 C 之间传递结构。如果可以,请告诉我如何传递它。
我使用 SWIG 接口(interface)在 C 和 Python 之间传递值。示例程序运行良好(使用变量)。我已经添加了带有结构的代码,但我不确定它的代码格式。如果我做错了什么,请纠正我。我是 Python 和 C 的新手。我到处搜索使用 SWIG 传递结构,但没有得到任何正确答案。
逻辑是从Python中获取输入值并在c中执行乘法运算并将值返回给Python。
Sample.c
#include<stdio.h>
#include "sample.h"
struct info sample;
int getstruct (struct info sample);
int getstruct (struct info sample) {
int i = 0;
int j = 0;
int k = 0;
int l = 0;
i = 2 * sample.i;
j = 2 * sample.j;
k = 2 * sample.k;
l = 2 * sample.l;
sample.i = i;
sample.j = j;
sample.k = k;
sample.l = l;
return(&sample);
}
sample.h
struct info
{
int i;
int j;
int k;
int l;
};
extern struct info data;
sample.i
%module sample
%{
#include "sample.h"
%}
%include "sample.h"
sample.py (automatically generated by SWIG)
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 2.0.11
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
from sys import version_info
if version_info >= (2,6,0):
def swig_import_helper():
from os.path import dirname
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_sample', [dirname(__file__)])
except ImportError:
import _sample
return _sample
if fp is not None:
try:
_mod = imp.load_module('_sample', fp, pathname, description)
finally:
fp.close()
return _mod
_sample = swig_import_helper()
del swig_import_helper
else:
import _sample
del version_info
try:
_swig_property = property
except NameError:
pass # Python < 2.2 doesn't have 'property'.
def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
if (name == "thisown"): return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'SwigPyObject':
self.__dict__[name] = value
return
method = class_type.__swig_setmethods__.get(name,None)
if method: return method(self,value)
if (not static):
self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
def _swig_setattr(self,class_type,name,value):
return _swig_setattr_nondynamic(self,class_type,name,value,0)
def _swig_getattr(self,class_type,name):
if (name == "thisown"): return self.this.own()
method = class_type.__swig_getmethods__.get(name,None)
if method: return method(self)
raise AttributeError(name)
def _swig_repr(self):
try: strthis = "proxy of " + self.this.__repr__()
except: strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
try:
_object = object
_newclass = 1
except AttributeError:
class _object : pass
_newclass = 0
class info(_object):
__swig_setmethods__ = {}
__setattr__ = lambda self, name, value: _swig_setattr(self, info, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, info, name)
__repr__ = _swig_repr
__swig_setmethods__["i"] = _sample.info_i_set
__swig_getmethods__["i"] = _sample.info_i_get
if _newclass:i = _swig_property(_sample.info_i_get, _sample.info_i_set)
__swig_setmethods__["j"] = _sample.info_j_set
__swig_getmethods__["j"] = _sample.info_j_get
if _newclass:j = _swig_property(_sample.info_j_get, _sample.info_j_set)
__swig_setmethods__["k"] = _sample.info_k_set
__swig_getmethods__["k"] = _sample.info_k_get
if _newclass:k = _swig_property(_sample.info_k_get, _sample.info_k_set)
__swig_setmethods__["l"] = _sample.info_l_set
__swig_getmethods__["l"] = _sample.info_l_get
if _newclass:l = _swig_property(_sample.info_l_get, _sample.info_l_set)
def __init__(self):
this = _sample.new_info()
try: self.this.append(this)
except: self.this = this
__swig_destroy__ = _sample.delete_info
__del__ = lambda self : None;
info_swigregister = _sample.info_swigregister
info_swigregister(info)
# This file is compatible with both classic and new-style classes.
cvar = _sample.cvar
Error message:
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sample
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sample.py", line 28, in <module>
_sample = swig_import_helper()
File "sample.py", line 24, in swig_import_helper
_mod = imp.load_module('_sample', fp, pathname, description)
ImportError: ./_sample.so: undefined symbol: data
>>>
Commands used:
swig -python sample.i
gcc -fPIC -c sample.c sample_wrap.c -I/usr/include/python2.7
ld -shared sample.o sample_wrap.o -o _sample.so
最佳答案
可以查看swig .
我自己使用它并且可以确认它工作得很好。查看tutorial以 Python 为例。
正在执行以下代码:
头文件:
#include<stdio.h>
typedef struct
{
int i;
int j;
int k;
int l;
} MyStruct;
extern MyStruct sample;
extern int getstruct (MyStruct sample);
C文件
#include "example.h"
int getstruct (MyStruct sample) {
int i = 0;
int j = 0;
int k = 0;
int l = 0;
i = 2 * sample.i;
j = 2 * sample.j;
k = 2 * sample.k;
l = 2 * sample.l;
sample.i = i;
sample.j = j;
sample.k = k;
sample.l = l;
return(&sample);
}
接口(interface)文件:
%module example
%{
#include "example.h"
%}
%include "example.h"
编译和链接文件:
$ swig -python example.i
$ gcc -fPIC -c example.c example_wrap.c -I/usr/include/python2.7
$ gcc -lpython -shared example.o example_wrap.o -o _example.so
现在是 python:
>>> import example
>>> a = example.MyStruct
>>> dir(a)
['__class__', '__del__', '__delattr__', '__dict__', '__doc__',
'__format__', '__getattr__', '__getattribute__', '__hash__',
'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__swig_destroy__', '__swig_getmethods__',
'__swig_setmethods__', '__weakref__', 'i', 'j', 'k', 'l', 'this']
>>> a.i = 1
>>> a.j = 1
>>> a.k = 1
>>> a.l = 1
>>> example.getstruct(a)
1605330080
我不确定结果是什么(也许是样本地址?)。
PS:我看了 Lee Daniel Crocker 的回复,值得考虑。
关于python - 有没有办法在 Python 和 C 之间传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28842433/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!