2012-01-09 13 views
7

Potrzebuję katalogu tymczasowego, ale chcę mieć pełną kontrolę nad jego tworzeniem i usuwaniem.Katalog tymczasowy pozostaje w obrębie przebiegów programu

Będę używał tego katalogu do umieszczania repozytoriów git, które chcę monitorować dla nowych zatwierdzeń, więc muszę przechowywać je gdzieś na stałe.

Dlatego chcę uniknąć katalogu /tmp, ponieważ może on zostać wyczyszczony przez użytkownika (?). Jaka jest najlepsza praktyka w tym zakresie?

Odpowiedz

1

http://pypi.python.org/pypi/appdirs to moduł Pythona oferujący międzyplatformową funkcję user_cache_dir.

+0

Wow, dzięki. Chyba to jest droga. Zastanawiam się po prostu 'user_cache_dir' vs' site_data_dir', który jest bardziej odpowiedni dla mojego przypadku. – umpirsky

8

tempfile.mkdtemp utworzy dla Ciebie katalog temp i zwróci jego nazwę. Domyślnie utworzy go w /tmp (w systemach uniksowych), ale "w możliwie bezpieczny sposób" oraz z uprawnieniami do odczytu/zapisu/listy tylko dla identyfikatora użytkownika dzwoniącego.

>>> d = tempfile.mktemp() 
>>> with open(os.path.join(d, "secret")) as output: 
...  output.write("Ha, you can't read this!") 

(Btw., W systemie Unix/Linux z ustawieniami domyślnymi, użytkownicy mogą nie tylko edytować lub usunąć pliki nawzajem od /tmp.)

+0

Hehum, patrzyłem na to. Więc nie mogę polegać na tym, że po stworzeniu tempdir zawsze tam będzie? Muszę też zapamiętać raz utworzoną ścieżkę dir i używać jej przy każdym uruchomieniu aplikacji, prawda? Czy zalecamy utworzenie jednego tmpdiru najwyższego poziomu dla wszystkich moich podkatalogów (repozytoriów git) lub oddzielenie każdego z nich w swoim tempdir? Dzięki. – umpirsky

+0

@umpirsky: Czy chcesz, aby katalog tymczasowy przetrwał w trakcie przebiegu programu? –

+0

Najprawdopodobniej po prostu utworzymy katalog w '/ tmp', który jest domyślny dla [' tempfile.tempdir'] (http://docs.python.org/library/tempfile.html#tempfile.tempdir). – sth

8

Powiedziałbym, że najlepszą praktyką jest używać tempfile.mkdtemp.

Jeśli nie wan do korzystania /tmp wtedy można skorzystać z parametru prefix:

import tempfile 
tempfile.mkdtemp(prefix=<your_preferred_directory>) 

EDIT: Odnośnie co jest najbardziej odpowiedni katalog do sotre konfigurację aplikacji, dane pamięci podręcznej, itp Jeśli używasz Linuksa, spójrz na numer XDG Base Directory Specification.

0

Zazwyczaj programy używają katalogu ~/.progname do przechowywania danych, które powinny być trwałe, ale powinny pozostać "na uboczu" użytkownika.

2

Jeśli jest to naprawdę tymczasowe, skorzystaj z porady larmans i użyj mkdtemp.

Jeśli jest to coś w rodzaju półtrwałej pamięci podręcznej, która musi przetrwać ponowne uruchomienie, powinieneś użyć lokalnego katalogu aplikacji, zdefiniowanego przez twój system operacyjny (% APPDATA%, ~/.local/etc); niektóre zestawy narzędzi (na przykład Qt) udostępniają funkcje do przeglądania tego folderu w sposób międzyplatformowy.

Edit: z Wikipedii:

  • HOME (Unix-like) i USERPROFILE (Microsoft Windows) - wskazuje, gdzie katalog domowy użytkownika znajduje się w systemie plików.
  • STRONA GŁÓWNA/{. AppName} (w systemie Unix) i APPDATA {Nazwa programisty \ Nazwa aplikacji} (Microsoft Windows) - do przechowywania ustawień aplikacji. Wiele otwartych programy źródłowe nieprawidłowo używać USERPROFILE do ustawień aplikacji w Windows - USERPROFILE powinny być stosowane tylko w dialogach, które pozwalają użytkownikowi wybrać między ścieżkami jak Dokumenty/Zdjęcia/Downloads/Muzyka, dla celów programowych korzystania APPDATA (roaming) LocalAppData lub ProgramData (dzielone pomiędzy użytkownikami)

Dlatego należy patrzeć os.environ['APPDATA'] lub os.environ['HOME'], w zależności od platformy (patrz sys.platform), a następnie dołączyć swoją nazwę aplikacji, a następnie można przechowywać tam cokolwiek chcesz.

mydir = os.path.join(".myAppName", "cache") 
homeVar = 'HOME' # default for all *nix variants 
if sys.platform == 'win32': 
    homeVar = 'APPDATA' 
mydir = os.path.join(os.environ[homeVar], mydir) 
0

Wystarczy jednak: można zajrzeć do git commit hooks. W ten sposób zamiast monitorować katalog tmp dla nowych commitów (brzmi dziwnie: kto byłby zobowiązany do katalogu tmp z ograniczonymi uprawnieniami?) Repo informuje o zatwierdzeniach, a dokładniej automatycznie uruchamia skrypt po każdym zatwierdzeniu.

+0

Buduję jakiś monitor git, który będzie powiadamiał o zmianach w gałęzi master. Sth jak githubs RSS. Aby wykryć zmiany, muszę pobrać gdzieś repozytorium. Dlatego potrzebuję tmp reż. Thx, – umpirsky

+0

Czy nie chcesz mieć go w stałym katalogu, więc nie musisz klonować całego repo za każdym razem, gdy chcesz sprawdzić zmiany? – a2800276

+0

Tak, wygląda na to, że źle podałem moje pytanie. – umpirsky

Powiązane problemy