2013-01-11 14 views
13

W Pythonie 3.2 (i inne wersje) z documentation for os.open stanowi:Przypadek użycia dla niskiego poziomu os.open, os.fdopen i przyjaciół?

Funkcja ta jest przeznaczona do niskiego poziomu I/O. Do normalnego użycia użyj wbudowanej funkcji open(), która zwraca obiekt pliku za pomocą metod read() i write() (i wielu innych). Aby zawinąć deskryptor pliku w obiekcie pliku, użyj fdopen().

I for fdopen():

Powrót otwarty obiekt połączony plik deskryptora pliku fd. Jest to alias funkcji open() i akceptuje te same argumenty. Jedyna różnica polega na tym, że pierwszy argument fdopen() musi zawsze być liczbą całkowitą.

This comment na pytanie o różnicę między io.open i os.open (ta różnica jest całkowicie jasne dla mnie, Zawsze używam io.open, nigdy os.open) pyta: dlaczego ktoś miałby wybierać Pythona na niskim poziomie I/O?, ale tak naprawdę nie otrzymuje odpowiedzi.

Moje pytanie jest bardzo podobny do komentarza-pytanie: w Pythonie, co ma miejsce w przypadku korzystanie z niskiego poziomu I/O poprzez os.open, os.fdopen, os.close, os.read, itd.? Kiedyś myślałem, że to było konieczne do deamonizacji procesu, ale I'm not so sure anymore. Czy jest jakieś zadanie, które można wykonać tylko przy użyciu niskiego poziomu we/wy, a nie w przypadku owijaczy wyższego poziomu?

+0

Domyślam się, że opakowania wyższego poziomu używają tych funkcji. Co najmniej moduł 'tempfile' używa większości z nich na python 2.7.3 ... – mgilson

+0

@mgilson Następnie moje pytanie brzmi, dlaczego nie można użyć plików tempfile wyższych poziomów? – gerrit

Odpowiedz

4

Główne różnice:

  • niski poziom dostępu do plików jest niebuforowana
  • niski poziom dostępu nie jest przenośny
  • Niski poziom pozwala na bardziej precyzyjną kontrolę ziarnista, np czy blokować czy nie blokować po czytać

przypadków użycia dla niskiego poziomu IO:

  • Plik jest urządzeniem blok
  • Plik jest gniazdem
  • Plik jest tty
  • ...

We wszystkich tych przypadkach możesz chcieć mieć bardziej drobnoziarnistą kontrolę (nad buforowaniem i zachowaniem blokującym).

Prawdopodobnie nigdy nie będziesz potrzebować funkcji niskiego poziomu dla zwykłych plików. Myślę, że przez większość czasu przypadkiem użycia będzie jakiś sterownik urządzenia. Jednak lepiej to zrobić w C. Ale widzę również przypadek użycia dla Pythona, np. do szybkiego prototypowania sterowników urządzeń.

5

Używam go, gdy potrzebuję użyć O_CREAT | O_EXCL do atomicznego utworzenia pliku, jeśli nie istnieje plik. Nie można sprawdzić istnienia pliku, a następnie utworzyć plik, jeśli test wykrył, że nie istnieje, ponieważ stworzy to warunek wyścigu, w którym plik mógłby zostać utworzony w okresie przejściowym między czekiem a tworzeniem.

Krótko mówiąc na the link you provided, uważam, że tworzenie plików pidfile ma stan wyścigu.

W języku Python 3.3 jest a new 'x' mode dodany do open(), który wydaje się, że to robi. Jednak tego nie próbowałem.

Powiązane problemy