SWIG:如何将复杂列表从 C++ 传递到 python
SWIG: How to pass list of complex from c++ to python
我在 c++ 中有一个函数 returns 一个复杂的列表:
#include <complex>
std::list< std::complex<double> > func(...);
我应该在“*.i”文件中做什么?
谢谢大家
=================
详情如下:
我想在 python 中使用的功能 x.h:
std::list<std::complex<double> > roots1(const double& d, const double& e);
我试过一些方法:
(1) x.i:
%include <std_list.i>
%include <std_complex.i>
比我在 IPython 中尝试的要多:
tmp = x.roots1(1.0, 2.0)
len(tmp)
我得到了:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-9ebf7dab7cd9> in <module>()
----> 1 len(tmp)
TypeError: object of type 'SwigPyObject' has no len()
和:
dir(tmp)
returns:
[
...
'acquire',
'append',
'disown',
'next',
'own']
(2) x.i:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexDouble) complex<double>;
}
然后,我得到了编译错误:
error: command 'swig' failed with exit status 1
make: *** [py] Error 1
(3) 在 x.i 中:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexDouble) list<complex<double> >;
}
或:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexDouble) list<complex>;
}
我得到了:
x_wrap.cpp:5673:32: error: ‘complex’ was not declared in this scope
template <> struct traits<complex > {
^
============================================= ===
(Mr./Ms./Mrs) m7thon 帮我找出问题所在。
在我的 python 上下文中:
Ubuntu: 45~14.04.1
Python: 3.4.3
SWIG: SWIG Version 2.0.11
Compiled with g++ [x86_64-unknown-linux-gnu]
Configured options: +pcre
如果将 x.i 定义为:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexList) list<complex<double> >;
}
会出现编译错误。但如果 x.i:
%include <std_list.i>
%include <std_complex.i>
%template(ComplexList) std::list< std::complex<double> >;
谢谢m7thon。
这个有效:
%include <std_list.i>
%include <std_complex.i>
%template(ComplexList) std::list<std::complex<double> >;
... (your includes / function declarations)
我认为您的版本 (3) 实际上也应该有效。奇怪的是它没有。可能是 SWIG 错误。
为了更简洁,您可以使用整个命名空间:
%include <std_list.i>
%include <std_complex.i>
using namespace std;
%template(ComplexList) list<complex<double> >;
但是最初建议的将 SWIG %template
包含到 std
命名空间中的版本并不是一个好主意。
我在 c++ 中有一个函数 returns 一个复杂的列表:
#include <complex>
std::list< std::complex<double> > func(...);
我应该在“*.i”文件中做什么?
谢谢大家
=================
详情如下:
我想在 python 中使用的功能 x.h:
std::list<std::complex<double> > roots1(const double& d, const double& e);
我试过一些方法:
(1) x.i:
%include <std_list.i>
%include <std_complex.i>
比我在 IPython 中尝试的要多:
tmp = x.roots1(1.0, 2.0)
len(tmp)
我得到了:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-9ebf7dab7cd9> in <module>()
----> 1 len(tmp)
TypeError: object of type 'SwigPyObject' has no len()
和:
dir(tmp)
returns:
[
...
'acquire',
'append',
'disown',
'next',
'own']
(2) x.i:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexDouble) complex<double>;
}
然后,我得到了编译错误:
error: command 'swig' failed with exit status 1
make: *** [py] Error 1
(3) 在 x.i 中:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexDouble) list<complex<double> >;
}
或:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexDouble) list<complex>;
}
我得到了:
x_wrap.cpp:5673:32: error: ‘complex’ was not declared in this scope
template <> struct traits<complex > {
^
============================================= ===
(Mr./Ms./Mrs) m7thon 帮我找出问题所在。 在我的 python 上下文中:
Ubuntu: 45~14.04.1
Python: 3.4.3
SWIG: SWIG Version 2.0.11
Compiled with g++ [x86_64-unknown-linux-gnu]
Configured options: +pcre
如果将 x.i 定义为:
%include <std_list.i>
%include <std_complex.i>
namespace std {
%template(ComplexList) list<complex<double> >;
}
会出现编译错误。但如果 x.i:
%include <std_list.i>
%include <std_complex.i>
%template(ComplexList) std::list< std::complex<double> >;
谢谢m7thon。
这个有效:
%include <std_list.i>
%include <std_complex.i>
%template(ComplexList) std::list<std::complex<double> >;
... (your includes / function declarations)
我认为您的版本 (3) 实际上也应该有效。奇怪的是它没有。可能是 SWIG 错误。
为了更简洁,您可以使用整个命名空间:
%include <std_list.i>
%include <std_complex.i>
using namespace std;
%template(ComplexList) list<complex<double> >;
但是最初建议的将 SWIG %template
包含到 std
命名空间中的版本并不是一个好主意。