2010-04-21 1 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 

код выглядит следующим образом:Синтаксическая ошибка при использовании "с открытым" в Python (Python новичку)

[[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") 

и я использую Python 2.5.5

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

примечание: этот синтаксис верен в python 2.6.5 –

+1

Это тоже правильно в 2.5 ... Есть ли больше контекста для файла, который вы не разместили? Фрагмент работает отлично для меня (2.5.4) –

+1

Фрагмент прекрасно работает и для меня. Что говорит '/ usr/bin/python -V'? –

ответ

8

Что вы должны быть правильными. Python 2.5 представил инструкцию WITH как что-то, что вы можете импортировать с __future__. Поскольку ваш код верен, единственное объяснение, о котором я могу думать, это то, что ваша версия python - это не то, что вы думаете. Есть хорошая вероятность, что у вас есть несколько версий python, установленных в системе, и по какой-то причине ваш код работает со старой версией. Попробуйте выполнить это следующим образом:

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

Предполагая, что это работает, вы можете изменить первую строку, чтобы указать, какую версию питона вы хотите. Это может быть либо прямой путь к python2.5, либо вы можете использовать команду env для поиска переменной PATH пользователя для python2.5. Правильный подход зависит от того, что устанавливаются вашими системами python. Вот 2 подхода:

Чтобы использовать /usr/bin/python2.5 напрямую, вы можете сделать это:

#!/usr/bin/python2.5 

Чтобы использовать любой вариант python2.5 происходит сначала в вашем PATH, это сделать :

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

да У меня есть несколько версий, и это сработало. Я использую это для git post commit hook, поэтому я думаю, что он хочет сделать «./test.py». – Tony

+0

может захотеть отредактировать ваш ответ, отметив, что это можно устранить, изменив строку shebang, чтобы указать на правильную версию питон. благодаря! – Tony

+0

Хорошая точка. Я редактировал свой пост, чтобы добавить это; спасибо, что указали это. – Benson

3

Может быть, так?

#!/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

ответ на этот вопрос похоронен в комментариях ОП. @Tamas дал правильное решение выше, как только @Tony подтвердил, что его код был исполнен 2.4:

«Итак, /usr/local/bin/python - 2.5.5, но вы вызываете свой скрипт с /usr/bin/python, который равен 2.4.3. Попробуйте заменить shell shebang с этим: #!/usr/bin/env python. "

в общем, будьте осторожны жестко прописывать свой путь, то есть, /usr/bin, /usr/local/bin и т.д., поэтому команда env была изобретена. это особенно актуально, если в вашей системе установлено несколько версий Python.

Однако было довольно ясно, что это была старая проблема Python, поскольку этот код OP будет выполняться на любом 2.5 и более новом интерпретаторе. эта синтаксическая ошибка выдает это сообщение независимо от того, какая версия Python вы используете . вы используете.

Смежные вопросы