2012-02-10 14 views
20

Ho il seguente codice Python per scrivere i file di dipendenza di un progetto. Funziona bene con Python 2.x, ma durante il test con Python 3 segnala un errore.Operatore Python 3 >> per stampare su file

depend = None 
if not nmake: 
    depend = open(".depend", "a") 
dependmak = open(".depend.mak", "a") 
depend = open(".depend", "a") 
print >>depend, s, 

Ecco l'errore:

Traceback (most recent call last): 
    File "../../../../config/makedepend.py", line 121, in <module> 
    print >>depend, s, 
    TypeError: unsupported operand type(s) for >>: 
     'builtin_function_or_method' and '_io.TextIOWrapper' 

Qual è il modo migliore per ottenere questo lavoro con Python 2.xe 3.x?

+0

"con python2.x e 3.x"? Non puoi avere lo stesso codice in entrambe le versioni. Di solito, si usa lo strumento '2to3' per convertire Python 2 funzionante in Python 3. –

+3

Puoi usare' da __future__ import print_function' per ottenere la funzione python 3 print() in Python 2. Vedi anche http://python3porting.com –

risposta

31

In Python 3 l'istruzione print è diventata una funzione. La nuova sintassi è simile al seguente: cambiamento

print(s, end="", file=depend) 

Questa rottura in Python 3 significa che non è possibile utilizzare lo stesso codice in Python 2 e 3 quando si scrive in un file utilizzando il print istruzione/funzione. Una possibile opzione sarebbe quella di utilizzare depend.write(s) anziché la stampa.

Aggiornamento: J.F. Sebastian indica correttamente che è possibile utilizzare from __future__ import print_function nel codice Python 2 per abilitare la sintassi Python 3. Sarebbe un modo eccellente per usare lo stesso codice su diverse versioni di Python.

+3

potresti usare 'da __future__ import print_function' per usare la funzione' print() 'in Python 2.x. btw, 'end =" "' non è lo stesso di una virgola in un'istruzione 'print'. Confronta ['print'a ',; print'b''] (http://ideone.com/ogwCh) e [' print (' a ', end =' '); print ('b') '] (http://ideone.com/py5k7) (nota: nessuno spazio tra' a' e 'b' in quest'ultimo caso). ' – jfs

8

print() è una funzione in Python 3.

modificare il codice per print(s, end="", file=depend), or let the 2to3 tool do it for you.

+2

è necessario specificare il parametro finale in modo che corrisponda al codice py2x –

+0

@DavidHeffeman Abbastanza vero. – Amber

2

Nota che a partire in Python 3.6.3 (settembre 2017), il messaggio di errore per questo caso cambierà raccomandare l'Python 3 ortografia:

>>> print >> sys.stderr 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for >>: 
    'builtin_function_or_method' and '_io.TextIOWrapper'. 
    Did you mean "print(<message>, file=<output_stream>)"? 

(interruzioni di linea esplicita aggiunto per evitare a scorrimento laterale - il messaggio di errore effettivo si limita alla larghezza della finestra del terminale)