我有一个扩展模块需要支持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
这两个都不管用。有没有可能使这项工作?你知道吗
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源代码的几个部分中找到它们。你知道吗例如,可以在
from __future__ import print_function
的效果下用如果要保存用户执行的future语句的效果,可以将PyCompilerFlags结构保存在某个位置,并对所有调用使用相同的结构。你知道吗
尽管如此,我不认为自动应用
from __future__ import print_function
是正确的做法。这会让人们惊讶,他们期待着任何一个解释器的默认行为。另外,PyRun_InteractiveOneFlags
对于让用户输入多行Python语句可能很有用。你知道吗相关问题 更多 >
编程相关推荐