2010-11-19 12 views
6

EDIT: Su suggerimento di JF Sebastian, posso ottenere lo stesso errore molto più semplicemente:Python "IOError: [Errno 22] Argomento non valido" quando si utilizza cPickle di scrivere vasta gamma di rete auto

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] 
Type "copyright", "credits" or "license" for more information. 

IPython 0.10 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

    Welcome to pylab, a matplotlib-based Python environment. 
    For more information, type 'help(pylab)'. 

In [1]: open(r'c:\test.bin', 'wb').write('a'*67076095) 

In [2]: open(r'c:\test.bin', 'wb').write('a'*67076096) 

In [3]: open(r'z:\test.bin', 'wb').write('a'*67076095) 

In [4]: open(r'z:\test.bin', 'wb').write('a'*67076096) 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

C:\Documents and Settings\User\<ipython console> in <module>() 

IOError: [Errno 22] Invalid argument 

In [5]: 

Si noti che C: è un'unità locale e Z: è un'unità di rete.

domanda iniziale:

Python 2.6.4 su Windows XP va in crash se uso cPickle di scrivere un file più grande di ~ 67 MB per la nostra unità di rete (ReadyNAS Pro Pioneer edizione). Mi piacerebbe essere in grado di mettere sottosopra file di grandi dimensioni. È un problema noto? C'è una soluzione?

Lo script che segue produce un incidente:

import cPickle, numpy 

a = numpy.zeros(8385007) 
print "Writing %i bytes..."%(a.nbytes) 
cPickle.dump(a, open('test_a.pkl', 'wb'), protocol=2) 
print "Successfully written." 

b = numpy.zeros(8385008) 
print "Writing %i bytes..."%(b.nbytes) 
cPickle.dump(b, open('test_b.pkl', 'wb'), protocol=2) ##Crashes on a network drive 
print "Successfully written." ##Doesn't crash on a non-network drive 

Ecco i passi che vuole per produrre un incidente al prompt ipython:

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] 
Type "copyright", "credits" or "license" for more information. 

IPython 0.10 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

    Welcome to pylab, a matplotlib-based Python environment. 
    For more information, type 'help(pylab)'. 

In [1]: pwd 
Out[1]: 'C:\\Documents and Settings\\User' 

In [2]: run test 
Writing 67080056 bytes... 
Successfully written. 
Writing 67080064 bytes... 
Successfully written. 

In [3]: cd Z: 
Z:\ 

In [4]: pwd 
Out[4]: 'Z:\\' 

In [5]: run 'C:\\Documents and Settings\\User\\test' 
Writing 67080056 bytes... 
Successfully written. 
Writing 67080064 bytes... 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

C:\Documents and Settings\User\test.py in <module>() 
     8 b = numpy.zeros(8385008) 
     9 print "Writing %i bytes..."%(b.nbytes) 
---> 10 cPickle.dump(b, open('test_b.pkl', 'wb'), protocol=2) 
    11 print "Successfully written." 
    12 

IOError: [Errno 22] Invalid argument 
WARNING: Failure executing file: <C:\\Documents and Settings\\User\\test.py> 

In [6]: 

C: è il disco fisso locale sulla macchina. Z: è il nostro spazio di archiviazione collegato alla rete.

+0

Nota: 'gamma numpy' può salamoia stessa:' a.dump'. – jfs

+1

'' apri (r'z: \ test.bin ',' wb '). Write (' a '* 67080064) 'funziona? – jfs

+0

Ottima domanda! Un modo molto più semplice per riprodurre lo stesso errore. Modificherò la domanda. – Andrew

risposta

15

Credo che il problema è legato alla: http://support.microsoft.com/default.aspx?scid=kb;en-us;899149

... così, basta provare: aperta (r'z: \ test.bin', 'w + b') scrivere (. 'Una '* 67080064)

* Nota l'argomento: 'w + b'

+0

Grazie! Questo funziona. – Andrew

+0

open (r'z: \ test.bin ',' wb '). Write (' a '* 67076096) non riesce, dove è aperto (r'z: \ test.bin', 'wb'). Write ('a '* 67076095) non ha esito negativo, ma è troppo piccolo. Fortunatamente, apriamo (r'z: \ test.bin ',' w + b '). Write (' a '* 67076096) funziona! – Andrew

+0

Non funziona per Mac OS X. La patch che risolve questo problema è in corso di revisione da molto tempo https://bugs.python.org/issue24658 – Serendipity