2011-02-12 123 views
0

我希望我的程序默認爲標準輸出,但可以選擇將其寫入文件。我應該創建自己的打印功能並調用那個有輸出文件的測試,或者有更好的方法嗎?這對我來說似乎效率低下,但我可以想到的每種方式都會爲每次打印呼叫調用附加的測試。我知道從長遠來看,這真的不重要,至少在這個劇本中,但我只是想學習好的習慣。處理輸出重定向的最佳方式是什麼?

回答

2

寫入文件對象,並且當程序啓動時,該對象指向sys.stdout或指向用戶指定的文件。

Mark Byers的答案更像unix,大多數命令行工具只使用stdin和stdout,並讓用戶按照他們認爲合適的方式進行重定向。

+0

謝謝,這可能是我會做的。 – kryptobs2000 2011-02-13 00:35:30

4

只需用print打印標準即可。如果用戶希望將輸出重定向到一個文件,他們可以這樣做:

python foo.py > output.txt 
+0

優秀的一點,我沒有想到這一點。但是,我仍然不能這樣做,因爲我也打印狀態消息到stdout,我不想進入該文件。 – kryptobs2000 2011-02-13 00:34:04

+1

@ kryptobs2000:你知道狀態和錯誤信息存在stderr,不是嗎?將狀態消息發送到`sys.stdout`有什麼意義? – tzot 2011-02-19 20:12:16

-1

我的反應將是輸出到一個臨時文件,然後或者轉儲到標準輸入輸出,或將其移動到他們要求的。

0

我建議你使用日誌模塊和logging.handlers ...流,輸出文件等。

0

如果您在使用子模塊,然後根據您從您的命令行採取的選項,你可以有一個打開文件對象的stdout選項。這樣,從程序內部可以重定向到一個文件。

import subprocess 
with open('somefile','w') as f: 
    proc = subprocess.Popen(['myprog'],stdout=f,stderr=subprocess.PIPE) 
    out,err = proc.communicate() 
    print 'output redirected to somefile' 
1

不,您不需要創建單獨的打印功能。在Python 2.6,你有這樣的語法:

# suppose f is an open file 
print >> f, "hello" 

# now sys.stdout is file too 
print >> sys.stdout, "hello" 

在Python 3.X:

print("hello", file=f) 
# or 
print("hello", file=sys.stdout) 

所以,你真的沒有區分文件和標準輸出。他們是一樣的。

的玩具例子,它輸出「你好」你想要的方式:

#!/usr/bin/env python3 
import sys 

def produce_output(fobj): 
    print("hello", file=fobj) 
    # this can also be 
    # fobj.write("hello\n") 

if __name__=="__main__": 
    if len(sys.argv) > 2: 
     print("Too many arguments", file=sys.stderr) 
     exit(1) 

    f = open(argv[1], "a") if len(argv)==2 else sys.stdout 
    produce_output(f) 

注意,印刷過程抽象它是否與標準輸出或文件的工作。

相關問題