Синтаксическая ошибка при использовании «с открытым» в Python - PullRequest
13 голосов
/ 21 апреля 2010
[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

Ответы [ 3 ]

8 голосов
/ 21 апреля 2010

То, что вы имеете, должно быть правильным. 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
3 голосов
/ 21 апреля 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")
1 голос
/ 22 апреля 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 вы думаете вы используете.

...