2012-06-26 12 views
5

Przeczytałem w książce, że /dev/random jest jak plik nieskończony, ale kiedy ustawię następujące kody, aby zobaczyć, jak wyglądają treści, nic nie drukuje.Jak czytać/dev/random w pytonie

with open("/dev/random") as f: 
    for i in xrange(10): 
     print f.readline() 

BTW, kiedy próbowałem to z /dev/urandom, to działało.

+2

Dlaczego czytasz * linie * z losowym urządzenia binarnym? –

+0

@ IgnacioVazquez-Abrams Czy w środku jest zawartość binarna? Wtedy 'readline' musi czekać na nieistniejący powrót karetki. Ale dlaczego to działa dla/dev/urandom? – satoru

Odpowiedz

8

To jest wyprowadzanie losowe bajty, a nie przypadkowych linii. Nic nie widzisz, dopóki nie otrzymasz nowej linii, która będzie się zdarzać tylko co 256 bajtów. Wydaje się, że powodem jest to, że /dev/urandom działa szybciej. Zaczekaj dłużej, czytaj mniej lub użyj /dev/urandom.

+1

Wydaje mi się, że błędnie napisałeś/dev/random z/dev/urandom ... – golja

+0

golja, nie? '/ dev/urandom' to osobne urządzenie, które generuje tylko pseudolosowe dane, w przeciwieństwie do'/dev/random', które próbują wykonać właściwą pracę (ale wymaga to o wiele więcej czasu). – tripleee

5
with open("/dev/random", 'rb') as f: 
    print repr(f.read(10)) 
14

FWIW, preferowanym sposobem dostępu do tego strumienia (lub coś podobnego) w pół-przenośny sposób jest os.urandom()

+2

+1 dla 'os.urandom' –

+2

' os.urandom' zwraca '/ dev/urandom', inny strumień (mniej bezpieczny, a jeszcze szybciej) na systemach Linux. – soulseekah