2012-02-29 99 views
2

我有以下C++函数使用字符串设置整数。为什么这个extern“C”函数不能用python ctypes工作?

#include <sstream> 
#include <string> 
#include <iostream> 
using namespace std; 

extern "C" { 
    int a() { 
    int number; 
    string value("100"); 
    std::istringstream strm(value); 
    strm >> number; 
    if (strm.fail()) { 
     cout << "Ouch!" << endl; 
    } 
    else { 
     cout << "Number set to:" << number << endl; 
    }; 
    return (int)strm.bad(); 
    } 
} 

int main(int argc, char **argv) 
{ 
    a(); 
} 

如果我编译它作为一个程序,它的工作原理。

$ g++ ./streamtest.cc -o streamtest;./streamtest 
Number set to:100 

但如果我调用同一个函数从ctypes的它不设置整数和“STRM”留在一个“坏”状态。

$ g++ -shared streamtest.cc -o libstreamtest.so 
$ python -c "import ctypes;a = ctypes.CDLL('libstreamtest.so').a();print 'Got [%s] from a()' %a" 
Ouch! 
Got [1] from a() 

这让我感到困惑。我如何使这个功能在ctypes下工作?

+0

会不会是蟒蛇库加载程序没有正确调用由标准库的流需要一些全局/静态构造函数? – 2012-02-29 16:21:19

+0

您是否尝试过单步调试和比较他们开始偏离的位置? – PlasmaHH 2012-02-29 16:26:29

+1

确strm有错误的功能? (一个在strm.fail()后打印错误) – KevinDTimm 2012-02-29 16:28:47

回答

1

它适用于使用x86构建的Windows 7(x64)。你有没有尝试用C包装代码以用作Python模块?也许这并不为你工作..

C:\Users\niklas\Desktop>g++ -o streamtest.pyd -shared -I"C:\Python27\include" -L"C:\Python27\libs" streamtestmodule.cpp -lpython27 


C:\Users\niklas\Desktop>python 
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import streamtest 
>>> streamtest.a() 
Number set to:100 
0 

#include <Python.h> 
#include "streamtest.cpp" 

extern "C" { 

static PyObject* streamtest_a(PyObject* self) { 
    PyObject* re = Py_BuildValue("i", a()); 
    return re; 
} 

static PyMethodDef StreamtestMethods[] = { 
    {"a", (PyCFunction) streamtest_a, METH_NOARGS, NULL}, 
    {NULL, NULL, 0, NULL} 
}; 


void initstreamtest(void) { 
    PyObject* module = Py_InitModule("streamtest", StreamtestMethods); 
    if (module == NULL) { 
     cout << "Module initialization failed."; 
    } 
} 

} // extern "C" 
+0

谢谢,我也试过了python模块版本。它给出了同样的错误。我也尝试了不同的python解释器和g ++版本,但都给出了相同的错误。我也尝试了不同的OSX版本(10.7与10.6),我没有在10.7中得到错误。 – SiggyF 2012-02-29 19:58:22

+1

显然它是一个OSX g ++ - 4.2错误。这是[由苹果确认](https://discussions.apple.com/thread/2214707?start=0&tstart=0),但没有简单的方法,除了删除手动定义GLIBCXXDEBUG。我设法通过编译使用* llvm-g ++ * for OSX 10.6来解决它。将来我会尝试使用macports的最新g ++编译所有东西(包括python)。 – SiggyF 2012-02-29 21:11:56

相关问题