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中工作的任何想法或建议?我应该使用不同的编译器吗?
听起来好像直接写到stdout
.Python stdout
不一定和C一样stdout
通常你会将一个字符串返回给Python,所以Python可以将它打印到它自己的 stdout
如果你需要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.stdout
c &- 一样疯狂的事情;-).
当然,如果你需要多次写入,stdout
只需要一次就可以更有效,只要需要就可以保持它,并且当你完成"打印"的东西时只减少一次(但这样做不会很正常)如果您的Python调用者sys.stdout
在您拥有对其先前版本的引用时重新分配:您将继续打印到以前的版本,就像类似行为的Python编码模块一样).这种重复查找相当于sys.stdout.write(somestring)
在Python中进行,它每次都会查找 - 稍微慢一些但是"语义更安全",以防你的Python调用者正在做"非常前卫"的事情sys.stdout
(因为你已经发现了IDLE确实;-).((并非所有那些前卫,真的,所以你可能想要正确地支持它;-)).
归档时间: |
|
查看次数: |
1009 次 |
最近记录: |