Почему Python-скрипты, запускаемые через CGI / WSGI в Unix-подобных системах, дают сбой, если в файле есть окончания строки CRLF?

1

Раньше было несколько случаев, когда я пытался запустить скрипт Python под CGI или WSGI, только чтобы получить следующую неоднозначную ошибку в моем журнале веб-сервера:

[error] [client <client>] (2)No such file or directory: exec of '/path/to/web/root/test.py' failed

Это происходит даже с очень простым скриптом, то есть:

#!/usr/bin/python
print "Content-Type: text/html\n\n"

print "Hello, World!"

Раньше мне удалось решить проблему, убедившись, что файл использует окончательные строки UNIX, но из любопытства у меня возникают следующие вопросы:

  1. Насколько я знаю, приведенная выше ошибка означает, что исполняемый файл python не может быть найден; я прав?
  2. В случае, если исполняемый файл python не найден, почему? Разрывы CRLF нарушают линию shebang?
  3. Есть ли обходной путь для этого, кроме преобразования формата? Возможно ли настроить CGI/WSGI таким образом, чтобы это автоматически обрабатывалось?

Я проверил этот конкретный пример с Apache 2.2 на Ubuntu 11.04, запустив Python 2.6 под CGI.

Теги:
cgi
wsgi
webserver

2 ответа

1
Лучший ответ

В случае, если исполняемый файл python не найден, почему? Разрывы CRLF нарушают линию shebang?

Да, это так.

Есть ли обходной путь для этого, кроме преобразования формата? Возможно ли настроить CGI/WSGI таким образом, чтобы это автоматически обрабатывалось?

Что-то, что не заставляет вас хотеть блевать? Я так не думаю.

-1

Python сможет обрабатывать окончательные строки CRLF, но Linux/Unix ожидает только LF, когда заканчивается строка, поэтому невероятное уродливое обходное решение может быть (имеющее ^ M как часть имени файла):

$ sudo ln -s /usr/bin/python /usr/bin/python^M

Обратите внимание, что вам нужно избежать ^ M из командной строки, поэтому в bash это будет ^ V ^ M.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню