Выполнение скрипта Python в Apache2 - PullRequest
12 голосов
/ 05 февраля 2012

Я пытаюсь выполнить программу на Python, используя Apache.Тем не менее, Apache будет обслуживать только файл, а не исполнять его.Права доступа к файлу: r / w / x и находятся в /var/www.Я опубликую содержание httpd.conf и код программы после.Я также попытался запустить скрипт Python как файл .cgi, но это не сработало.У меня есть и модули mod_python и mod_wsgi, загруженные в apache.

Пример Python:

#!/usr/bin/python

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

httpd.conf:

AddHandler cgi-script .cgi .pl
AddHandler python-program .py

IЯ знаю, что это небольшой файл httpd.conf, но когда я установил apache, в нем ничего не было.Я должен также упомянуть, что это просто для того, чтобы я изучил основы работы с Python в Apache.Он не предназначен для производства.Спасибо за помощь!

Редактировать

Я использую ОС Ubuntu 10.04 и версию apache 2. У меня есть версия Python 2.6, которая автоматически используется при вызове #!/usr/bin/env python.
Я получаю две основные ошибки, во-первых, файл не найден, хотя разрешения для файла и папки 777. Ошибка в журнале:

[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1

Эта ошибкадля другого скрипта Python, который я не писал.Что странно, так это то, что файл отображается в индексе папки при доступе из окна браузера.Однако, когда я перехожу к файлу, я получаю вышеуказанную ошибку.

Другая ошибка, которую я получаю, - преждевременное завершение заголовков.Ошибка ниже:

[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py

Ответы [ 6 ]

18 голосов
/ 05 февраля 2012

Первая строка httpd.conf: AddHandler cgi-script .cgi .pl не имеет значения, так как вы тестируете скрипты на Python, а не на Perl.И вы должны определить эти директивы в пределах местоположения вашего скрипта python и сказать apache, что он должен выполнять скрипты cgi в этом месте: Options +ExecCGI.Этот фрагмент будет началом:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
</Directory>

Приложение 1 :

Согласно моему последнему комментарию, попробуйте этот скрипт.Он должен выплевывать информацию о среде cgi.

#!/usr/bin/python
import cgi
cgi.test()

Приложение 2 :

Я получил ваш скрипт для работы с вышеуказанной конфигурацией.Проблема в том, что скрипт написан на python2.И интерпретатор по умолчанию apache вызывает для выполнения сценария python3 (по крайней мере, в моем случае, и есть вероятность, что это будет то же самое и для вас).

Это версия сценария hello world на python3:

#!/usr/bin/env python

# enable debugging
import cgitb
cgitb.enable()

print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")

Приложение 3 :

При первой ошибке убедитесь, что права доступа и права собственности на любой каталог и файлы, которые вы пытаетесь развернуть, указаны правильно.задавать.И попробуйте добавить эти директивы в httpd.conf:

Order allow,deny
Allow from all

, что даст вам следующее:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
  Order allow,deny
  Allow from all
</Directory>

Для второй ошибки, если я что-то упустил, похоже, что apacheвызов интерпретатора Python 3 для выполнения вашего скрипта.Чтобы исключить эту возможность, вы можете попробовать следующее:

ls -al /usr/bin/python*

В этом списке перечислены интерпретаторы python, доступные в вашей системе.Если у вас более одного переводчика, вы получите что-то похожее на этот вывод:

/usr/bin/python -> python3*
/usr/bin/python2.6*  
/usr/bin/python3*  

Если нет, то это будет такой вывод:

/usr/bin/python -> python2.6*
/usr/bin/python2.6*  

Чтобы убедиться, что этоне проблема, с которой вы столкнулись, попробуйте использовать этот модифицированный пример сценария:

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

Вы заметите, что я прямо упомянул версию интерпретатора, которую должен вызывать apache, что ужасно.Но ради тестирования вы можете сделать это.Конечно, вы должны сопоставить #!/usr/bin/python2.6 с любым двоичным файлом, установленным на вашем сервере, и убедиться, что вы не смешиваете совместимый код Python 3 с интерпретатором Python 2 и наоборот.

3 голосов
/ 21 марта 2014

Re: Exec format error.

Я сам сталкивался с этим пару раз раньше.У меня было точно такое же (загадочное) сообщение об ошибке.

Я разрабатывал скрипты Python (3) для использования через CGI в Notepad ++ на моей машине с Windows, а затем загружал их на мой сервер Linux.* После большого разочарования я обнаружил, что эта проблема связана с окончаниями строк , и вам нужно преобразовать окончания строк Windows (\ r \ n) в окончания строк UNIX (\ n) .

В Notepad ++ (6.1.5) этого можно достичь, перейдя в меню Редактировать и выбрав параметр EOL преобразование , а затем сохранив файл.

1 голос
/ 28 июня 2016

** Для apache2 версии 2.4

sudo apt-get install python
sudo apt-get install apache2

редактировать файл /etc/apache2/conf-enables/serve-cgi-bin.conf

==== прокомментируйте старый раздел и добавьте код ниже:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AddHandler cgi-script .py
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

=========================================

редактировать файл /etc/apache2/apache2.conf *** добавить код ниже:

<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

<Directory /usr/local/apache2/cgi-bin>
Require all granted
</Directory>

Внимание!

use for apache2.4 
  file python keep in directory: /var/www/cgi-bin/
  You can test :go to http://localhost/cgi-bin/<namefile>.py

referrence https://www.linux.com/blog/configuring-apache2-run-python-scripts

0 голосов
/ 28 ноября 2017

У меня был тот же симптом, и моя конфигурация выглядела нормально по сравнению с ответами выше.

Я обнаружил, что моя новая установка не была настроена на загрузку mod_cgi.so

Загрузка требуемого модуля выглядитнемного похоже на это.Если перезапуск сервера выдаст ошибку, что файл не был найден, выясните, где файл корректирует путь соответствующим образом.

LoadModule cgi_module modules/mod_cgi.so

0 голосов
/ 06 июня 2017

В моем случае это была тривиальная проблема. Я должен был добавить эту строку:

#!/usr/bin/python3

в начало каждого .py файла, который я хотел запустить.

Затем все стало работать правильно.

0 голосов
/ 23 апреля 2013

Я предполагаю, что вы используете Firefox.Я читал где-то еще в сети, что это может быть связано с аддонами Firefox, установленными на машине.

Я получаю эту ошибку, и я использую Firefox 20. Перешел на Opera, и я не получил больше ошибок, и скрипты Python, казалось, выполнялись просто отлично.

Редактировать: Это было на самом делеВызов метода eval (), который я пропустил и который добавил «(» и «)» к результатам сценария, вызвавшего мою ошибку.Как только я удалил их, это сработало для меня.

Я заметил, что вы не публикуете javascript, html или что-то еще, что вы используете для вызова скрипта. Возможно, выможет опубликовать это для нас?Я сделал пример прямого копирования / вставки с сайта блога, не глядя на то, что я скопировал.Это была моя ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...