Почему скрипты python, запускаемые через CGI / WSGI в unix-подобных системах, дают сбой, если в файле есть окончания строки CRLF? - PullRequest
1 голос
/ 05 декабря 2011

В прошлом было несколько случаев, когда я пытался запустить скрипт 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 линию Шебанга?
  3. Есть ли обходной путь для этого, кроме преобразования формата?Можно ли настроить CGI / WSGI таким образом, чтобы он обрабатывал это автоматически?

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

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

В случае, если исполняемый файл python не может быть найден, почему? Прерывает ли конец CRLF линию Шебанга?

Да, вот и все.

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

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

0 голосов
/ 05 декабря 2011

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

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

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

...