为什么我的'hello world'Python C模块在除了IDLE之外的所有东西中都能正常工作?

Jus*_*eel 2 c python windows module mingw

我为Python编译了一个简单的hello world C模块,它在我尝试过但IDLE的所有内容中都能正常工作.这是我输入的测试方法:

>>> import hello
>>> hello.say_hello('Justin')
Run Code Online (Sandbox Code Playgroud)

我在命令提示符(我正在使用Windows),Eclipse的PyDev和PieDream中使用Python尝试了这一点,它们都打印出来Hello Justin!.但是,在IDLE中它不会打印任何东西 - 它只是给我提示.

setup.py我正在使用的模块来自此页面.我认为问题出在编译器上.我正在使用MinGW,我将其设置为.cfg文件中distutils的编译器.我从命令提示符构建模块:

python setup.py build
Run Code Online (Sandbox Code Playgroud)

得到

running build
running build_ext
building 'hello' extension
creating build
creating build\temp.win32-2.6
creating build\temp.win32-2.6\Release
C:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python26\include -IC:\Python26\PC -c hellomodule.c -o build\temp.win32-2.6\Release\hellomodule.o
writing build\temp.win32-2.6\Release\hello.def
creating build\lib.win32-2.6
C:\MinGW\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.6\Release\hellomodule.o build\temp.win32-2.6\Release\hello.def -LC:\Python26\libs -LC:Python26\PCbuild -lpython26 -lmsvcr90 -o build\lib.win32-2.6\hello.pyd
Run Code Online (Sandbox Code Playgroud)

我在想它可能与那里的-mno-cygwin部分有关,但我不确定.

关于为什么这个模块不能在IDLE中工作的任何想法或建议?我应该使用不同的编译器吗?

Joh*_*ooy 5

听起来好像直接写到stdout.Python stdout不一定和C一样stdout

通常你会将一个字符串返回给Python,所以Python可以将它打印到它自己的 stdout


Ale*_*lli 5

如果你需要sys.stdout从C编码的扩展中写入Python ,你可以使用类似的东西:

void writeout(const char* nullterminated)
{
    PyObject* sysmod = PyImport_ImportModuleNoBlock("sys");
    PyObject* pystdout = PyObject_GetAttrString(sysmod, "stdout");
    PyObject* result = PyObject_CallMethod(pystdout, "write", "s", nullterminated);
    Py_XDECREF(result);
    Py_XDECREF(pystdout);
    Py_XDECREF(sysmod);    
 }
Run Code Online (Sandbox Code Playgroud)

(另外,据推测,一点点错误检查 - 只是为了理智,以防有人做了像del sys.stdoutc &- 一样疯狂的事情;-).

当然,如果你需要多次写入,stdout只需要一次就可以更有效,只要需要就可以保持它,并且当你完成"打印"的东西时只减少一次(但这样做不会很正常)如果您的Python调用者sys.stdout在您拥有对其先前版本的引用时重新分配:您将继续打印到以前的版本,就像类似行为的Python编码模块一样).这种重复查找相当于sys.stdout.write(somestring)在Python中进行,它每次都会查找 - 稍微慢一些但是"语义更安全",以防你的Python调用者正在做"非常前卫"的事情sys.stdout(因为你已经发现了IDLE确实;-).((并非所有那些前卫,真的,所以你可能想要正确地支持它;-)).