2012-08-28 2 views
1

J'ai un certain programme Python qui repose sur un script CGI, qui fonctionne quand je lance un Python BaseHTTPServer avec un CGIHTTPServer. Mais je voudrais que tout cela soit exécuté sans installer Python, j'ai donc utilisé Py2Exe.Le serveur local Py2Exe n'exécute pas CGI

Je parviens à créer un fichier .exe à partir de mon script, ce qui crée en effet un serveur Web local opérationnel lorsqu'il est exécuté. Les scripts CGI, cependant, ne sont affichés que comme du code et ne sont pas exécutés.

Voici le tout script serveur, qui lance également le navigateur par défaut:

#!/usr/bin/env python 

import webbrowser 
import BaseHTTPServer 
import CGIHTTPServer 

server = BaseHTTPServer.HTTPServer 
handler = CGIHTTPServer.CGIHTTPRequestHandler 
server_address = ("", 8008) 
handler.cgi_directories = ["/cgi"] 
httpd = server(server_address, handler) 
webbrowser.open_new("http://localhost:8008/cgi/script.py"); 
httpd.serve_forever() 

Cependant, ce script.py est simplement affichée et non exécutés. Je ne peux pas comprendre pourquoi, et j'ai essayé quelques versions différentes dans handler.cgi_directories, juste au cas où ...

+0

Vous démarrez le navigateur avant de lancer le serveur – stark

+0

Hehe, non, ce n'est pas la réponse, mais merci. Ce script fonctionne lorsqu'il est appelé par Python - le navigateur met du temps à s'initialiser, donc httpd est déjà utilisé. Si je démarre le navigateur après «servir pour toujours», cette ligne n'est jamais appelée. Quoi qu'il en soit, une fois que le serveur est opérationnel, je peux ouvrir une fenêtre de navigateur manuellement et naviguer jusqu'à cette adresse, avec les mêmes résultats: Je vois le code CGI, il n'est pas en cours d'exécution. – Notnasiul

+0

exécutez tcpdump sur l'interface de lo et voir les demandes et les réponses. – stark

Répondre

1

problème est py2exe convertit seulement votre script serveur à exe, tous les scripts cgi sont encore .py et ils nécessitent l'installation de Python pour fonctionner. essayez de convertir chaque script dans le répertoire 'cgi'.
Assuiming vous server.py dans les scripts dir racine et cgi à wwwroot\cgi-bin votre setup.py devrait ressembler à

#!usr/bin/env python 
from distutils.core import setup 
import py2exe, os 

setup(name='server', 
    console=['server.py'], 
    options={ 
       "py2exe":{ 
         "unbuffered": True, 
         "packages": "cgi, glob, re, json, cgitb",  # list all packages used by cgi scripts 
         "optimize": 2, 
         "bundle_files": 1 
       }}, 
    zipfile="library.zip") 
os.rename("dist\\library.zip","dist\\library.zip.bak")     # create backup of the library file 

files=[] 
for f in os.listdir("wwwroot\\cgi-bin"):        # list all cgi files with relative path name 
    files.append("wwwroot\\cgi-bin\\"+f) 

setup(name='cgi', 
    console= files, 
    options={ 
     "py2exe":{ 
         "dist_dir": "dist\\wwwroot\\cgi-bin", 
         "excludes": "cgi, glob, re, json, cgitb",  # we are going to discard this lib, may as well reduce work 
         "bundle_files": 1 
       } 
      }, 
    zipfile="..\\..\\library.zip")          # make sure zipfile points to same file in both cases 

os.remove("dist\\library.zip")           # we don't need this generated library 
os.rename("dist\\library.zip.bak","dist\\library.zip")     # we have already included everything in first pass 
Questions connexes