วิธีข้ามแพลตฟอร์มในการรับไดเรกทอรีชั่วคราวใน Python


255

มีวิธีข้ามแพลตฟอร์มในการรับเส้นทางไปยังtempไดเรกทอรีใน Python 2.6 หรือไม่

ตัวอย่างเช่นภายใต้ลินุกซ์ที่จะเป็น/tmpในขณะที่ภายใต้ C:\Documents and settings\[user]\Application settings\TempXP


ไม่ใช่ไพ ธ อนลิสต์ แต่คุณควรใช้วิธีการเหล่านี้ในการสร้างไฟล์ / ได
เร็กตอรี่

1
ดูโมดูล tempfile ที่docs.python.org/library/tempfile.html
Jordan Parmer

คำตอบ:


381

นั่นจะเป็นโมดูลtempfile

มันมีฟังก์ชั่นเพื่อรับไดเรกทอรีชั่วคราวและยังมีทางลัดบางอย่างเพื่อสร้างไฟล์ชั่วคราวและไดเรกทอรีในนั้นทั้งชื่อหรือไม่ได้ตั้งชื่อ

ตัวอย่าง:

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

เพื่อความสมบูรณ์นี่คือวิธีการค้นหาไดเรกทอรีชั่วคราวตามเอกสาร:

  1. ไดเรกทอรีตั้งชื่อโดยTMPDIRตัวแปรสภาพแวดล้อม
  2. ไดเรกทอรีตั้งชื่อโดยTEMPตัวแปรสภาพแวดล้อม
  3. ไดเรกทอรีตั้งชื่อโดยTMPตัวแปรสภาพแวดล้อม
  4. ตำแหน่งเฉพาะของแพลตฟอร์ม:
    • บนRiscOSไดเร็กทอรีที่ตั้งชื่อโดยWimp$ScrapDirตัวแปรสภาวะแวดล้อม
    • บนวินโดวส์ , ไดเรกทอรีC:\TEMP, C:\TMP, \TEMPและ\TMPในลำดับที่
    • ในทุกแพลตฟอร์มอื่น ๆ ไดเรกทอรี/tmp, /var/tmpและ/usr/tmpในลำดับที่
  5. เป็นทางเลือกสุดท้ายไดเรกทอรีทำงานปัจจุบัน

7
สำหรับฉันแล้ว OSX วางไว้/var/folders/<garbage/here>แทนที่จะเป็น/tmpเพราะเป็นวิธีการ$TMPDIRตั้งค่า ดูที่นี่
Rick Smith

3
ปัจจุบันด้วย python 3.6.5 บน Windows 10 tempfile.gettempdir()สามารถแก้ไขC:\users\user\AppData\Local\Tempได้ เส้นทางที่น่าเสียดาย
แก้ปัญหาเมื่อ

61

สิ่งนี้ควรทำในสิ่งที่คุณต้องการ:

print tempfile.gettempdir()

สำหรับฉันในกล่อง Windows ของฉันฉันจะได้รับ:

c:\temp

และในกล่อง Linux ของฉันฉันจะได้รับ:

/tmp

15

ฉันใช้:

from pathlib import Path
import platform
import tempfile

tempdir = Path("/tmp" if platform.system() == "Darwin" else tempfile.gettempdir())

นี่เป็นเพราะใน MacOS เช่นดาร์วินtempfile.gettempdir()และos.getenv('TMPDIR')ส่งคืนค่าเช่น'/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; มันเป็นสิ่งที่ฉันไม่ต้องการ


1
อย่างน้อยในกรณีนี้ MacOS ทำสิ่งที่ถูกต้องในการส่งคืนไดเรกทอรีชั่วคราวที่แยกระดับผู้ใช้ให้คุณ ฉันมั่นใจ 99.99% ว่านี่คือสิ่งที่คุณต้องการ .... เว้นแต่คุณต้องการยุ่งกับระบบปฏิบัติการ
sorin

1
@ โซริน 99.99% ยืดได้ ฉันจะบอกว่า 50% มีเหตุผลมากกว่านี้ บ่อยครั้งที่ฉันทำงานกับการประมวลผลหลายครั้งและจากนั้นฉันต้องการให้ temp dir เดียวกันสำหรับกระบวนการทั้งหมด
คิวเมนตัส

11

วิธีที่ง่ายที่สุดตามความคิดเห็นและคำตอบของ @ nosklo :

import tempfile
tmp = tempfile.mkdtemp()

แต่ถ้าคุณต้องการควบคุมการสร้างไดเรกทอรีด้วยตนเอง:

import os
from tempfile import gettempdir
tmp = os.path.join(gettempdir(), '.{}'.format(hash(os.times())))
os.makedirs(tmp)

ด้วยวิธีนี้คุณสามารถทำความสะอาดตัวเองได้อย่างง่ายดายเมื่อคุณทำเสร็จ (เพื่อความเป็นส่วนตัวทรัพยากรความปลอดภัยหรืออะไรก็ตาม) ด้วย:

from shutil import rmtree
rmtree(tmp, ignore_errors=True)

นี้จะคล้ายกับสิ่งที่ใช้งานเช่น Google Chrome และลินุกซ์systemdไม่ พวกเขาใช้แฮช hex ที่สั้นกว่าและคำนำหน้าเฉพาะแอพเพื่อ "โฆษณา" การแสดงตนของพวกเขา


1
คุณควรใช้tempfile.mkdtemp()แทน
nosklo

@nosklo เป็นตัวเลือกแน่นอนและจะใช้ประโยชน์จากความทนทานทั้งหมดที่มีอยู่ในแพ็คเกจ tempfile แต่วิธีแฮชให้คุณสร้างเส้นทางของการเลือกและซ้อนหลายไดเรกทอรีในแผนผังไดเรกทอรีที่ตรงกับความต้องการของคุณ โดยทั่วไปแล้วmkdtemp()คุณขอแนะนำรุ่นที่ยืดหยุ่นกว่าและยืดหยุ่นกว่า
เตาแก๊ส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.