Синтаксическая ошибка при использовании с open в Python (новичок в Python)

[root@234571-app2 git]# ./test.py 
  File "./test.py", line 4
    with open("/home/git/post-receive-email.log",'a') as log_file:
            ^
SyntaxError: invalid syntax

Код выглядит следующим образом:

[root@234571-app2 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

[root@234571-app2 git]# python -V
Python 2.5.5

person Tony    schedule 21.04.2010    source источник
comment
примечание: этот синтаксис верен в python 2.6.5   -  person Karmic Coder    schedule 21.04.2010
comment
Это правильно и в версии 2.5... Есть ли дополнительный контекст в файле, который вы не разместили? Фрагмент работает нормально для меня (2.5.4)   -  person Josh Wright    schedule 21.04.2010
comment
У меня тоже работает сниппет. Что вам говорит /usr/bin/python -V?   -  person Will McCutchen    schedule 21.04.2010
comment
хммм /usr/bin/python 2.4.3, я только что обновился до 2.5.5, и когда я делаю, какой python я получаю /usr/local/bin/python, который равен 2.5.5 ... я согласен, что это может быть проблемой, но тогда почему какой питон не указывает на 2.4.3?   -  person Tony    schedule 21.04.2010
comment
Итак, /usr/local/bin/python — это 2.5.5, но вы вызываете свой скрипт с /usr/bin/python, что равно 2.4.3. Попробуйте заменить строку shell shebang на эту: #!/usr/bin/env python.   -  person Tamás    schedule 21.04.2010
comment
изменение shebang, чтобы указать на версию 2.5.5, является лучшим ответом. Благодарность!   -  person Tony    schedule 21.04.2010
comment
Кроме того, избавьтесь от Python 2.4. Последний выпуск исправления этого цикла был выпущен 19 декабря 2008 года, ровно четыре года назад!   -  person asmeurer    schedule 20.12.2012


Ответы (3)


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

[root@234571-app2 git]# /usr/bin/python2.5 test.py

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

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

#!/usr/bin/python2.5

Чтобы использовать ту версию python2.5, которая встречается первой в вашем PATH, сделайте следующее:

#!/usr/bin/env python2.5
person Benson    schedule 21.04.2010
comment
да, у меня есть несколько версий, и это сработало. я использую это для хука фиксации поста git, поэтому я думаю, что он хочет сделать ./test.py - person Tony; 21.04.2010
comment
возможно, вы захотите отредактировать свой ответ, упомянув, что это можно исправить, изменив строку shebang, чтобы она указывала на правильную версию python. Благодарность! - person Tony; 21.04.2010
comment
Хорошая точка зрения. Я отредактировал свой пост, чтобы добавить это; спасибо, что указали на это. - person Benson; 22.04.2010

Может вот так?

#!/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")
person Krumelur    schedule 21.04.2010

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

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

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

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

person wescpy    schedule 21.04.2010