web-dev-qa-db-fra.com

Exécution d'un script Python dans Apache2

J'essaie d'exécuter un programme Python avec Apache. Cependant, Apache ne servira que le fichier et ne l'exécutera pas réellement. Les autorisations sur le fichier sont r/w/x et il est dans /var/www. Je vais poster le contenu de httpd.conf et le code du programme après. J'ai également essayé d'exécuter le script python en tant que fichier .cgi mais cela n'a pas fonctionné aussi bien. Les modules mod_python et mod_wsgi sont également chargés dans Apache.

Exemple 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

Je sais que c'est un petit fichier httpd.conf, mais lorsque j'ai installé Apache, il n'y avait rien dans le fichier. Je devrais également mentionner que c'est simplement pour que j'apprenne les bases de l'exécution de python dans Apache. Ce n'est pas destiné à la production ... Merci pour votre aide!

Modifier

Le système d'exploitation que j'utilise est Ubuntu 10.04 et la version d'Apache est 2. J'ai la version 2.6 de python qui est automatiquement utilisée lorsque #!/usr/bin/env python est appelé.
J'obtiens deux erreurs principales, la première est que le fichier n'est pas trouvé alors que les autorisations du fichier et du dossier sont 777. L'erreur du journal est 

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

Cette erreur concerne un script python différent de celui que je n'ai pas écrit. Ce qui est étrange, c'est que le fichier apparaît dans l'index du dossier lorsqu'il est accédé depuis une fenêtre du navigateur. Cependant, lorsque je navigue dans le fichier, l'erreur ci-dessus apparaît.

L'autre erreur que je reçois est la fin prématurée des en-têtes. L'erreur est ci-dessous:

[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
12
tpar44

La première ligne de httpd.conf: AddHandler cgi-script .cgi .pl n'est pas pertinente, car vous testez des scripts python et non des scripts Perl. Et vous devez définir ces directives dans l'emplacement de votre script python et indiquer à Apache qu'elle doit exécuter les scripts cgi à cet emplacement: Options +ExecCGI. Cet extrait serait un début:

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

Addendum 1 :

Selon mon dernier commentaire, essayez ce script. Il devrait cracher des informations sur l'environnement CGI.

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

Addendum 2 :

J'ai eu votre script pour travailler avec la configuration ci-dessus. Le problème est que le script est écrit en python2. Et l'interprète par défaut qu'Apache appelle pour exécuter le script est python3 (du moins dans mon cas, et il est probable que ce serait la même chose pour vous aussi).

Ceci est une version python3 du script hello world:

#!/usr/bin/env python

# enable debugging
import cgitb
cgitb.enable()

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

print("Hello World!")

Addendum 3 :

Pour la première erreur, assurez-vous que l'autorisation et la propriété du répertoire et des fichiers que vous tentez de déployer sont correctement définies. Et essayez d’ajouter ces directives à httpd.conf:

Order allow,deny
Allow from all

Ce qui vous donnera ceci:

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

Pour la deuxième erreur, à moins que quelque chose ne me manque, il semblerait qu'Apache appelle un interpréteur Python 3 pour exécuter votre script. Pour écarter cette possibilité, essayez les solutions suivantes:

ls -al /usr/bin/python*

Ceci listera les interpréteurs python disponibles sur votre système. Si vous avez plus d'un interprète, vous obtiendrez quelque chose de similaire à cette sortie:

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

Sinon, ce serait cette sortie:

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

Pour vous assurer que ce n'est pas le problème que vous rencontrez, essayez avec cet exemple de script modifié:

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

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

print "Hello World!"

Vous remarquerez que j'ai explicitement mentionné la version de l'interprète qu'Apache doit appeler, ce qui est moche. Mais pour tester, vous pouvez le faire. Bien sûr, vous devriez mapper #!/usr/bin/python2.6, quel que soit le fichier binaire que vous avez sur votre serveur, et assurez-vous de ne pas mélanger le code comtipable python 3 avec un interpréteur python 2 et inversement.

18
ylabidi

Re: l'erreur de format Exec.

Je suis moi-même tombé sur cette question plusieurs fois auparavant. J'ai eu exactement le même message d'erreur (cryptique).

Je développais des scripts Python (3) à utiliser via CGI dans Notepad ++ sur ma machine Windows, puis je les téléchargeais sur mon serveur Linux.

Après beaucoup de frustration, j'ai découvert que ce problème est lié aux fins de ligne et vous devez convertir les fins de ligne Windows (\ r\n) en fins de ligne UNIX (\ n) .

Dans Notepad ++ (6.1.5), vous pouvez y parvenir en accédant au menu Modifier, en sélectionnant l'option de conversion EOL, puis en enregistrant le fichier.

3
nibbler

** Pour Apache2 version 2.4

Sudo apt-get install python
Sudo apt-get install Apache2

modifier le fichier /etc/Apache2/conf-enables/serve-cgi-bin.conf

==== commente l'ancienne section et ajoute le code ci-dessous:

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>

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

éditez le fichier /etc/Apache2/Apache2.conf *** ajouter le code ci-dessous:

<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>

Remarque! 

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

référence https://www.linux.com/blog/configuring-Apache2-run-python-scripts

1
siczones

Dans mon cas, c'était une question triviale. Je devais ajouter cette ligne:

#!/usr/bin/python3

au sommet de chaque fichier .py que je voulais exécuter. 

Ensuite, tout a commencé à fonctionner correctement.

0

J'ai eu le même symptôme et ma configuration semblait bien comparée aux réponses ci-dessus.

J'ai constaté que ma nouvelle installation n'était pas configurée pour charger mod_cgi.so

Le chargement du module requis ressemble un peu à ceci. Si le redémarrage du serveur vous donne une erreur indiquant que le fichier n'a pas été trouvé, déterminez où le fichier est ajusté en conséquence.

LoadModule cgi_module modules/mod_cgi.so

0
Chris