Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 2.5中的前向兼容打印语句_Python_Printing_Stdout - Fatal编程技术网

python 2.5中的前向兼容打印语句

python 2.5中的前向兼容打印语句,python,printing,stdout,Python,Printing,Stdout,好吧,也许我只是休息一天。这似乎是很多人都在问的问题,但谷歌让我非常失望。我发现的最接近的东西是没有完全解决这个问题 在工作中,我在桌面上运行Arch(默认情况下是python3),在公司的服务器上运行Debian Lenny(默认情况下是python2.5)。我想编写一个python脚本,它可以在Python2和Python3中工作。这是一个非常简单的脚本,对它来说不算太多(大多数情况下,它只是使用子流程调用git)。除了该死的print语句之外,所有东西都已经在两个版本的python中运行了

好吧,也许我只是休息一天。这似乎是很多人都在问的问题,但谷歌让我非常失望。我发现的最接近的东西是没有完全解决这个问题

在工作中,我在桌面上运行Arch(默认情况下是python3),在公司的服务器上运行Debian Lenny(默认情况下是python2.5)。我想编写一个python脚本,它可以在Python2和Python3中工作。这是一个非常简单的脚本,对它来说不算太多(大多数情况下,它只是使用
子流程
调用git)。除了该死的
print
语句之外,所有东西都已经在两个版本的python中运行了

所有人似乎都建议使用来自未来导入打印功能的
技巧。然而,这是在Python2.6中引入的,我一直坚持使用2.5

那么我有什么选择呢?如何使用相同的脚本在2.5和3中调用
print
?我在想可能是某种包装器函数,但这可能不是最“python”的方式。你的想法?不,将服务器升级到2.6不是一个选项

谢谢

print(“hi”)
在py 2.5中既可以在py 2上使用,也可以在py 3上使用

或者,尽管不建议:

import sys
sys.stdout.write("hi")

为什么不直接使用这个框架呢?它缓解了您的问题,并且比在代码中乱七八糟地打印语句要好得多。

这对我很有用:

import sys
if sys.version_info[0] == 2:
    def print_(*args):
        w = sys.stdout.write
        w( ', '.join(str(a) for a in args) )
        w( '\n' )
else:
    print_ = getattr(__builtins__, 'print')
如果您需要功能齐全的打印功能,最好使用打印源。在这种情况下,

from six import print_
// replace all "print ..." by "print_(...)"

这是因为
(“hi”)
被视为
“hi”
。试试打印(“你好”,“那里”)
,甚至可以打印(“你好”)没错。它只是一组括号或元组。好的,重点是在我的旧脚本中,它会执行类似于,
print“value is”,val
的操作。如果我使用您的方法尝试此操作,当我需要
值为3时,我会得到
(“值为”,3)
。但是我确实喜欢您建议使用sys.stdout.write。对于这项任务来说,这可能已经足够了。作为建议,请在您的回答中澄清,
print(“hi”)
实际上不是函数print,而是一个hack。对许多人来说,这听起来很明显,但我认为这可能会导致一些混乱。真正的解决方案是在这两个地方都使用Python 3或Python 2。Arch可能已经将/usr/bin/python转换成了Python3,打破了所有这些用途,但至少它仍然将python2作为
python2
python2.x
(至少现在是这样)。好吧,那么可能还有一个附带的问题:如何指定我希望python2.x作为解释器运行?这个脚本会被很多东西(非交互)调用,所以不能只以
python2 scriptname
的形式运行它。非常好地回答了所有人的问题,谢谢。通常的方式是:shebang行。找到一个在两个系统上都适用的规范名称(您可能需要向服务器添加一个“python2”符号链接,以指向最新的Python 2.x安装),然后将其设为shebang行。@托马斯:如果我使用shebang行,我可以运行
/usr/bin/env python2
(在Arch上)这基本上确保了脚本不会在其他任何地方工作,或者
/usr/bin/env python
在任何地方都可以工作,但我无法确定调用的是哪个版本的python。这是一个很好的建议,但可能超出了我的需要。在一个40行的脚本中,这将增加10%;)