什麼是os.close(3)?什麼是os.close(3)?
我正在閱讀python cookbook 2nd第2.9章,它解釋了python zip文件是如何工作的。其中有一小段代碼,我真的不明白。
import zipfile, tempfile, os, sys
handle, filename = tempfile.mkstemp('.zip')
os.close(handle) # <- handle is int 3 here
z = zipfile.ZipFile(filename, 'w')
z.writestr('hello.py', 'def f(): return "hello world from "+__file__\n')
z.close()
sys.path.insert(0, filename)
import hello
print hello.f()
os.unlink(filename)
os.close()的解釋在python文檔:
此功能用於低級別的I/O,並且必須被應用到如由os.open返回文件描述符()或管()。要關閉由內建函數open()或popen()或fdopen()返回的「文件對象」,請使用其close()方法。
在Linux中文件描述符0,1 & 2標準輸入,標準輸出& stderror,我沒有得到什麼FD 3?即使我已經閱讀了這個「What is the file descriptor 3 assigned by default?」。
我評論os.close(handle)
出來,但輸出沒有什麼不同。
你從'tempfile.mkstemp'得到'handle',那你爲什麼不讀這個文檔呢?顯然你正在關閉臨時文件,爲什麼你會期望它是in/out/err中的三個標準文件句柄之一?另外,您應該閱讀樣式指南:http://www.python.org/dev/peps/pep-0008/。 – jonrsharpe
'3'完全沒有什麼魔力 - 如果你的程序是在已經使用FD 3的情況下啓動的,或者在打開另一個文件(並且該文件未被關閉)之前被分配了句柄號,那麼你將得到一個此處分配了不同的句柄號。 –
答案中沒有涉及到的一件事是,儘管你可以取消鏈接文件(即從目錄列表中刪除它的名字),但當有人仍然有句柄時,其內容不會消失。特別是,空間不會被釋放。 (通常的真實情況是「我刪除了3 gig logfile,爲什麼我沒有得到3 gig的可用空間?」 - 「因爲你的prorgam仍然打開刪除的文件」。) –