如何在C扩展模块中从未来导入

2024-06-25 22:50:08 发布

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

我有一个扩展模块需要支持python2和python3。当它加载时,我想做一些类似from __future__ import print_function的操作,这样如果有人尝试这样做:

PyRun_SimpleString("print 'foo'");

它将失败,但如果他们这样做:

PyRun_SimpleString("print('foo', file=sys.stdout)");

它会成功的。我尝试了很多方法,包括from future语句的PyRun_SimpleString。像这样:

PyRun_SimpleString("from __future__ import print_function");

我也试着这样称呼PyImport_ImportModuleEx

PyImport_ImportModuleEx("__future__", nullptr, nullptr, fromlist);

其中fromlist是表示列表["print_function"]PyObject

这两个都不管用。有没有可能使这项工作?你知道吗


Tags: 模块fromimportfoofunctionfuturepyrunpython3
1条回答
网友
1楼 · 发布于 2024-06-25 22:50:08

PyRun\u SimpleString没有任何地方可以指定编译器标志,但是有一个whole host of related functions提供了更多选项。例如,PyRun_SimpleStringFlags执行PyRun_SimpleString的操作,但使用flags参数指定编译器标志。^用PyRun_SimpleStringFlags执行的{}语句可以修改flags,并且使用相同flags的其他调用将看到更改。你知道吗

可以使用future语句或C级标志定义初始化flags。大多数可能的标志没有在C-api文档中列出(因为C-api文档有点糟糕),但是您可以在__future__模块或Python源代码的几个部分中找到它们。你知道吗

>>> import __future__
>>> for name in dir(__future__):
...     if name.startswith('CO_'):
...         print name
...
CO_FUTURE_ABSOLUTE_IMPORT
CO_FUTURE_DIVISION
CO_FUTURE_PRINT_FUNCTION
CO_FUTURE_UNICODE_LITERALS
CO_FUTURE_WITH_STATEMENT
CO_GENERATOR_ALLOWED
CO_NESTED

例如,可以在from __future__ import print_function的效果下用

PyCompilerFlags flags = {CO_FUTURE_PRINT_FUNCTION};
PyRun_SimpleStringFlags(command, &flags);

如果要保存用户执行的future语句的效果,可以将PyCompilerFlags结构保存在某个位置,并对所有调用使用相同的结构。你知道吗


尽管如此,我不认为自动应用from __future__ import print_function是正确的做法。这会让人们惊讶,他们期待着任何一个解释器的默认行为。另外,PyRun_InteractiveOneFlags对于让用户输入多行Python语句可能很有用。你知道吗

相关问题 更多 >