2013-05-16 53 views
8

python中是否有任何可以在C或C++中复制freopen()的功能的东西?准确地说,我希望复制的功能:freopen的Python版本()

freopen("input.txt","r",stdin); 

freopen("output.txt","w",stdout); 

然后使用相同的(标准)功能控制台I/O的文件I/O。有任何想法吗?

+0

相关:重定向标准输出到Python中的文件?(http://stackoverflow.com/q/4675728/4279) – jfs

回答

8

sys.stdout简直是file对象,所以,你可以将它重新打开到另一个目的地

out = sys.stdout 
sys.stdout = open('output.txt', 'w') 
// do some work 
sys.stdout = out 

out只用于恢复sys.stdout目的地工作之后恢复为默认(如建议的Martijn Pieters的 - 你可以恢复它使用sys.__stdout__ ,或者根本不恢复,如果你不需要的话)。

+0

'sys.stdin'是对应的阅读的版本? – Quixotic

+0

@Quixotic yes,sys.stdin和'r' – ForEveR

+0

另外一个好办法是让'old = sys.stdout'以防万一你再次需要它 – jamylak

4

如果您在* nix平台上工作,您可以编写自己的freopen

def freopen(f,option,stream): 
    import os 
    oldf = open(f,option) 
    oldfd = oldf.fileno() 
    newfd = stream.fileno() 
    os.close(newfd) 
    os.dup2(oldfd, newfd) 

import sys 
freopen("hello","w",sys.stdout) 

print "world" 
3

您可能也想看看contextmanager装饰在contextlib临时重定向:

from contextlib import contextmanager 
import sys 

@contextmanager 
def stdout_redirected(new_stdout): 
    save_stdout = sys.stdout 
    sys.stdout = new_stdout 
    try: 
     yield 
    finally: 
     sys.stdout = save_stdout 

例子:

with opened(filename, "w") as f: 
    with stdout_redirected(f): 
     print "Hello" 
0

试试这个:

import sys 
sys.stdin = open('input.txt', 'r') 
sys.stdout = open('output.txt', 'w') 

文本文件是自解释的。 您现在可以在Sublime Text或任何其他文本编辑器上运行此代码。

0

这应有助于:

import sys 

def freopen(filename, mode): 
    if mode == "r": 
     sys.stdin = open(filename, mode) 

    elif mode == "w": 
     sys.stdout = open(filename, mode) 

# ---- MAIN ---- 

freopen("input.txt", "r") 
freopen("output.txt", "w")