我正在尝试替换MATLAB / MEX并切换到Python。我遇到了SWIG,ctypes和Cython作为可能的解决方案,并开始尝试SWIG(这似乎很简单)。
我的C函数具有形式可变的参数长度main(int argc, char *argv[])。我在网上找到了解决方案,但是与SWIG一起使用会导致很多问题。
我可以让内置的类型,如int与double在C++命名空间中可用?
#include <complex>
typedef int my_int;
namespace my_namespace {
namespace std = ::std; // Works
using ::my_int; // Works
using ::int; // Fails: "expected unqualified-id before 'int'"
typedef ::int int; // Fails: "expected unqualified-id before 'int'"
}
typedef int out::int; // Fails: "expected unqualified-id before 'int'"
my_namespace::my_int x; // Works
my_namespace::std::complex<int> c; // Works
// I would like to use this:
my_namespace::int x2; // Fails: "expected unqualified-id before 'int'"
Run Code Online (Sandbox Code Playgroud)
我怀疑这是由于语言限制,禁止在其中使用带有关键字的限定标识符(int在本例中),但我希望有一些方法可以揭示这些.
我正在尝试使用命名空间来组织类型,以便外部工具(SWIG)可以适当地用另一种语言包装函数.例如: …
我正在尝试用 C++ 编写一段代码,它可以生成一个数组并将其作为 Python 列表返回。据我了解,我可以使用 numpy.i 中的类型映射将列表作为 NumPy 数组返回,但我正在使用的某些集群上未安装 NumPy。这个问题和我在这里看到的一些类似问题的主要区别是我想返回一个可变长度的 C 数组作为 Python 列表。
精简的 C++ 例程如下:
/* File get_rand_list.cpp */
#include "get_rand_list.h"
/* Define function implementation */
double* get_rand_list(int length) {
output_list = new double[length];
/* Populate input NumPy array with random numbers */
for (int i=0; i < length; i++)
output_list[i] = ((double) rand()) / RAND_MAX;
return output_list;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在 Python 中使用它,如下所示:
from get_rand_list import *
list = get_rand_list(10)
Run Code Online (Sandbox Code Playgroud)
这将返回一个包含 10 个随机浮点数的 Python 列表。如何使用 SWIG 类型映射来包装 C++ 例程来执行此操作?如果有一种更简单的方法,需要对 …
根据Swig文档和typemap中SWIG的出色解释,可以使用,但@Flexo不能使用argout,argouttypemap将引用参数转换为Python中的返回值。
我有一个场景,其中我传递了一个dict,然后将其转换为unordered_mapin typemap(in),然后将其填充到C ++ lib中。单步执行代码,我可以看到从C ++返回后,映射发生了变化,因此我想知道为什么不可能仅将unordered_map原位转换为dict已传递的映射。还是现在有可能,而我只是忽略了什么?
谢谢!
我在与我合作的C++项目中遇到了一些语法,并且不知道该怎么做.编译器不会抛出与此相关的任何错误:
lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME);
Run Code Online (Sandbox Code Playgroud)
注意[我假设的]函数参数之间的空格.
函数定义lua_pushstring是
LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);
Run Code Online (Sandbox Code Playgroud)
SWIG_RUNTIME_VERSION是#define等于"4"
SWIG_TYPE_TABLE_NAME 在以下块中定义:
#ifdef SWIG_TYPE_TABLE
# define SWIG_QUOTE_STRING(x) #x
# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
#else
# define SWIG_TYPE_TABLE_NAME
#endif
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这里发生了什么?
为了进一步参考,代码用于GitHub上的swig项目:luarun.swg:353和luarun.swg:364.
我必须使用Swig将C++中的矢量(几何向量)类包装到Python中.这个Vector3类的构造函数之一接受const double*:
Vector3(const double* list);
Run Code Online (Sandbox Code Playgroud)
我想将它包装起来,以便我可以在Python中执行此操作:
vec = Vector3([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?