Cách đa nền tảng để nhận thư mục tạm thời trong Python


255

Có cách nào đa nền tảng để nhận đường dẫn đến tempthư 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.


không phải là một pythonist, nhưng bạn nên sử dụng các phương pháp này để tạo các tệp / thư mục tạm thời
skrat

1
Xem mô-đun tempfile tại docs.python.org/l Library / tempfile.html .
Jordan Parmer

Câu trả lời:


379

Đó 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:

  1. Thư mục được đặt tên theo TMPDIRbiến môi trường.
  2. Thư mục được đặt tên theo TEMPbiến môi trường.
  3. Thư mục được đặt tên theo TMPbiến môi trường.
  4. Một vị trí dành riêng cho nền tảng:
    • Trên RiscOS , thư mục được đặt tên bởi Wimp$ScrapDirbiến môi trường.
    • Trên của Windows , các thư mục C:\TEMP, C:\TMP, \TEMP, và \TMP, theo thứ tự đó.
    • Trên tất cả các nền tảng khác, các thư mục /tmp, /var/tmp/usr/tmp, theo thứ tự đó.
  5. Như một phương sách cuối cùng, thư mục làm việc hiện tại.

7
Đối với tôi, OSX đang đưa nó vào /var/folders/<garbage/here>thay /tmpvì bởi vì đó là cách $TMPDIRđược thiết lập. Xem tại đây .
Rick Smith

3
Hiện tại, với python 3.6.5 trên Windows 10, tempfile.gettempdir()giải quyết thành C:\users\user\AppData\Local\Temp. Một con đường dài không may.
giải quyếtJ

61

Đ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

15

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()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


1
Ít nhất trong trường hợp này, MacOS thực hiện đúng việc trả lại cho bạn một thư mục tạm thời bị cô lập ở cấp độ người dùng. Tôi chắc chắn 99,99% đây là những gì bạn cần .... trừ khi bạn muốn gây rối với hệ điều hành.
sorin

1
@sorin 99,99% là một sự kéo dài. Tôi muốn nói 50% là thực tế hơn. Thường thì tôi đang làm việc với đa xử lý và sau đó tôi có thể muốn cùng một thư mục tạm thời cho tất cả các quy trình.
Acumenus

11

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 systemdlà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ọ.


1
bạn nên sử dụng tempfile.mkdtemp()thay thế
nosklo

@nosklo, đó chắc chắn là một tùy chọn và sẽ tận dụng tất cả sự mạnh mẽ được tích hợp trong gói tempfile, nhưng phương pháp băm cho phép bạn tạo một đường dẫn lựa chọn và lồng nhiều thư mục trong cây thư mục đáp ứng yêu cầu của bạn. Về cơ bản, đây là phiên bản rõ ràng hơn, linh hoạt hơn mkdtemp()mà bạn đề xuất.
hobs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.