qua*_*ant 9 python-2.x python-3.x
我正在编写一个应该与python2和python3一起使用的程序.为此,我想有一个函数写入stderr,它适用于两个python版本.
理想我认为会是这样的:
def writeStdErr(message):
if sys.version_info >= (3, 0):
print(message, end = "", file = sys.stderr)
else:
sys.stderr.write(message)
Run Code Online (Sandbox Code Playgroud)
python2的问题是,打印不是函数,所以我得到了
print(message, end = "", file = sys.stderr)
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我可以通过添加eval来摆脱这个:
def writeStdErr(message):
if sys.version_info >= (3, 0):
eval('print(message, end = "", file = sys.stderr)')
else:
sys.stderr.write(message)
Run Code Online (Sandbox Code Playgroud)
但是,我不喜欢这个解决方案; 我认为使用eval一般是个坏主意.
有谁知道更好/有更好的解决方案?
编辑:
对于将来遇到同样问题的人,以下事情似乎有效:
def writeStdErr(message):
sys.stderr.write(message)
Run Code Online (Sandbox Code Playgroud)
要么
from __future__ import print_function
import sys
def writeStdErr(message):
print(message, file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)
感谢所有答案
Dav*_*dmh 12
如果您使用的是Python2.7,则可以导入新的行为:
from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)
这应该是第一行代码(但可以追溯到shebang).
与早期版本兼容的另一种替代方法是在外部模块中创建它.
if sys.version_info >= (3, 0):
from print_sderr3 import writeStdErr
else:
from print_stderr2 import writeStdErr
Run Code Online (Sandbox Code Playgroud)
你已经相应地实现了每一个.
那是回答你的问题,但是,你可以只使用sys.stderr.write它们.唯一的区别是在Python 3中它似乎返回写入的字符数.如果您在交互模式下执行此操作:
>>> sys.stderr.write('aaaa\n')
aaaa
5
Run Code Online (Sandbox Code Playgroud)
你得到一个额外的5,但这只是返回值.
>>> a = sys.stderr.write('aaaa\n')
aaaa
>>> a
5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15884 次 |
| 最近记录: |