2010-04-21 11 views
13
[[email protected] git]# ./test.py 
    File "./test.py", line 4 
    with open("/home/git/post-receive-email.log",'a') as log_file: 
      ^
SyntaxError: invalid syntax 

El código es el siguiente:Error de sintaxis cuando se utiliza "con abierta" en Python (Python novato)

[[email protected] git]# more test.py 
#!/usr/bin/python 
from __future__ import with_statement 

with open("/home/git/post-receive-email.log",'a') as log_file: 
    log_file.write("hello world") 

y estoy usando Python 2.5.5

[[email protected] git]# python -V 
Python 2.5.5 
+0

nota: esta sintaxis es correcta en python 2.6.5 –

+1

Correcto en 2.5 también ... ¿Hay más contexto para el archivo que no ha publicado? El fragmento funciona bien para mí (2.5.4) –

+1

El fragmento también funciona bien para mí. ¿Qué te dice '/ usr/bin/python -V'? –

Respuesta

8

Lo que tener debe ser correcto. Python 2.5 introdujo la instrucción con como algo que puede importar desde __future__. Como tu código es correcto, la única explicación que puedo pensar es que tu versión de Python no es lo que crees que es. Es muy probable que tenga múltiples versiones de python instaladas en el sistema y, por alguna razón, su código se está ejecutando con una versión anterior. Intente ejecutar de esta manera:

[[email protected] git]# /usr/bin/python2.5 test.py 

Suponiendo que esto funciona, puede cambiar su primera línea para indicar la versión del pitón desea. Puede ser una ruta directa a python2.5 o puede usar el comando env para buscar la variable PATH del usuario para python2.5. El enfoque correcto depende de las instalaciones de instalación de python. Estos son los 2 enfoques:

Para utilizar /usr/bin/python2.5 directamente, puede hacer esto:

#!/usr/bin/python2.5 

para utilizar cualquier versión de python2.5 se produce por primera vez en su PATH, hacer esto :

#!/usr/bin/env python2.5 
+0

sí, tengo múltiples versiones, y funcionó. Estoy usando esto para un enlace de commit de git post, así que creo que quiere hacer "./test.py" – Tony

+0

podría querer editar su respuesta para mencionar que esto se puede arreglar cambiando la línea de shebang para que apunte a la versión correcta de pitón. ¡Gracias! – Tony

+0

Buen punto. He editado mi publicación para agregar eso; Gracias por mencionarlo. – Benson

3

Quizás como esto?

#!/usr/bin/env python2.5 
from __future__ import with_statement 

with open("/home/git/post-receive-email.log",'a') as log_file: 
    log_file.write("hello world") 
1

la respuesta a esta pregunta está enterrada en los comentarios de la OP. @Tamas dio la solución correcta una vez @Tony confirmó que su código estaba siendo ejecutado por 2.4:

"Entonces, /usr/local/bin/python es 2.5.5, pero está llamando al script con /usr/bin/python que es 2.4.3. Intente reemplazar el código línea shebang shell con esto: #!/usr/bin/env python. "

en general, tener cuidado de no hardcoding su camino, es decir, /usr/bin, /usr/local/bin, etc esto es por qué se inventó el comando env. es especialmente relevante cuando tiene múltiples versiones de Python instaladas en su sistema.

Sin embargo, fue un claro ejemplo de que era un problema antiguo de Python, ya que el código OP se ejecutará en cualquier intérprete de 2.5 o posterior. ese error de sintaxis emite este mensaje independientemente de la versión de Python que piensa que está usando.

Cuestiones relacionadas