为什么我的“hello world”Python C模块在除空闲之外的所有方面都能正常工作?

2024-05-29 02:59:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我为Python编译了一个简单的hello world C模块,它在我尝试过的所有东西中都能正常工作,但是空闲。以下是我输入的测试:

>>> import hello
>>> hello.say_hello('Justin')

我在命令提示符下使用Python(我使用的是Windows)、Eclipse的PyDev和PieDream尝试过,它们都打印出Hello Justin!。但是,在IDLE中它不打印任何内容-它只是给我提示。在

我使用的模块和setup.py来自{a1}。我认为问题出在编译器上。我使用MinGW,我将其设置为.cfg文件中distutils的编译器。我使用以下命令提示符构建模块:

^{pr2}$

然后得到

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

我在想这可能和-mno cygwin有关,但我不确定。在

对于为什么这个模块不能闲置工作有什么想法或建议?我应该使用不同的编译器吗?在


Tags: 模块buildcreatinghellorelease编译器tempwin32
2条回答

如果您需要从一个C编码的扩展写入Python的sys.stdout,那么可以使用类似于:

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);    
 }

(另外,大概还有一点错误检查,以防有人做了一些疯狂的事情,比如del sys.stdout&c;-)。在

当然,如果您需要多次写入,那么只获取stdout一次可能更有效,并根据需要将其保留多久,当您完成“打印”工作时,只需将其减少一次(但是,如果您的Python调用者在保留对其以前版本的引用时重新分配sys.stdout的情况下,这将不太正常:您将继续打印到上一个版本,就像一个行为类似的Python编码模块一样)。这种重复的查找相当于在Python中执行sys.stdout.write(somestring),它还每次查找速度稍慢但“语义上更安全”的内容,以防Python调用方使用sys.stdout执行“相当前卫”的操作(正如您发现的IDLE所做的;-)。((不是那么急躁,真的,所以您可能需要适当地支持它;-)。在

听起来像是在直接给stdout写信。Python的stdout与Cstdout不一定是同一个位置

通常,您将返回一个字符串给Python,这样Python就可以将它打印成它自己的stdout

相关问题 更多 >

    热门问题