Có cách nào đa nền tảng để nhận đường dẫn đến temp
thư mục trong Python 2.6 không?
Ví dụ, trong Linux sẽ như vậy /tmp
, trong khi dưới XP C:\Documents and settings\[user]\Application settings\Temp
.
Có cách nào đa nền tảng để nhận đường dẫn đến temp
thư mục trong Python 2.6 không?
Ví dụ, trong Linux sẽ như vậy /tmp
, trong khi dưới XP C:\Documents and settings\[user]\Application settings\Temp
.
Câu trả lời:
Đó sẽ là mô-đun tempfile .
Nó có các chức năng để có được thư mục tạm thời, và cũng có một số phím tắt để tạo các tệp và thư mục tạm thời trong đó, có tên hoặc không được đặt tên.
Thí dụ:
import tempfile
print tempfile.gettempdir() # prints the current temporary directory
f = tempfile.TemporaryFile()
f.write('something on temporaryfile')
f.seek(0) # return to beginning of file
print f.read() # reads data back from the file
f.close() # temporary file is automatically deleted here
Để đầy đủ, đây là cách nó tìm kiếm thư mục tạm thời, theo tài liệu:
TMPDIR
biến môi trường.TEMP
biến môi trường.TMP
biến môi trường.Wimp$ScrapDir
biến môi trường.C:\TEMP
, C:\TMP
, \TEMP
, và \TMP
, theo thứ tự đó./tmp
, /var/tmp
và /usr/tmp
, theo thứ tự đó./var/folders/<garbage/here>
thay /tmp
vì bởi vì đó là cách $TMPDIR
được thiết lập. Xem tại đây .
tempfile.gettempdir()
giải quyết thành C:\users\user\AppData\Local\Temp
. Một con đường dài không may.
Điều này sẽ làm những gì bạn muốn:
print tempfile.gettempdir()
Đối với tôi trên hộp Windows của tôi, tôi nhận được:
c:\temp
và trên hộp Linux của tôi, tôi nhận được:
/tmp
Tôi sử dụng:
from pathlib import Path
import platform
import tempfile
tempdir = Path("/tmp" if platform.system() == "Darwin" else tempfile.gettempdir())
Điều này là do trên MacOS, tức là Darwin tempfile.gettempdir()
và os.getenv('TMPDIR')
trả về một giá trị như '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'
; đó là một thứ mà tôi không phải lúc nào cũng muốn
Cách đơn giản nhất, dựa trên nhận xét và câu trả lời của @ nosklo :
import tempfile
tmp = tempfile.mkdtemp()
Nhưng nếu bạn muốn kiểm soát thủ công việc tạo các thư mục:
import os
from tempfile import gettempdir
tmp = os.path.join(gettempdir(), '.{}'.format(hash(os.times())))
os.makedirs(tmp)
Bằng cách đó, bạn có thể dễ dàng dọn dẹp sau khi hoàn thành (vì quyền riêng tư, tài nguyên, bảo mật, bất cứ điều gì) với:
from shutil import rmtree
rmtree(tmp, ignore_errors=True)
Điều này tương tự với những gì các ứng dụng như Google Chrome và Linux systemd
làm. Họ chỉ sử dụng hàm băm hex ngắn hơn và tiền tố dành riêng cho ứng dụng để "quảng cáo" sự hiện diện của họ.
tempfile.mkdtemp()
thay thế
mkdtemp()
mà bạn đề xuất.