Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Python CGI-Script met local import

Pagina: 1
Acties:

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik programmeer vrijwel nooit maar af en toe vind ik het leuk om iets te proberen. Nu probeer ik een Python CGI-Script te maken. Dit werkt prima alleen kan ik geen locale klasse aanroepen.

Ik heb twee files: Index.cgi en address.py.

pseudo code index.cgi
code:
1
2
3
4
5
import address 

ip = address.ip()
print ip.getIP('eth0')
print ip.getNetmask('eth0')


address.py
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python                                                                                                                                                              
import netifaces
class ip:
    def getInt():
        int = netifaces.interfaces()
        return int[1];

    @staticmethod
    def getIP( int ):
        int = netifaces.ifaddresses(int)
    s = int[netifaces.AF_INET]
        return s[0]["addr"];

    @staticmethod
    def getNetmask( int ):
        int = netifaces.ifaddresses(int)
        s = int[netifaces.AF_INET]
        return s[0]["netmask"];

    def setIP():
        return;


Als ik de index.cgi uitvoer dan krijg ik netjes de output die ik verwacht:
10.0.201.175
255.255.255.0

Helaas bij het runnen van de website krijg ik een error:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
 /usr/lib/cgi-bin/index.cgi in ()
      4 import sys
      5 sys.path.insert(0, "/usr/lib/cgi-bin/")
=>    6 import address
      7 sys.path.insert(0, "/usr/local/lib/python")
      8 
address undefined
 /usr/lib/cgi-bin/address.py in ()
=>    2 import netifaces
      3 class ip:
      4     def getInt():
      5         int = netifaces.interfaces()
      6         return int[1];
netifaces undefined


Volgens mij komt dit dus doordat de file wordt uitgevoerd door de apache user die op andere plekken (kan) kijken voor de imports. Vandaar dat ik de "sys.path.insert(0, "/usr/lib/cgi-bin/")" opgeef, dit is de locatie waar zowel index.cgi als address.py staan. Helaas werkt dit niet.

Wat doe ik verkeerd en hoe los ik dit op. Is dit uberhaupt wel de manier hoe ik hoor te werken? Ik kan ook gewoon de address.py in de standaard locatie gooien (/usr/local/lib/python) maar dat lijkt me wel heel erg vreemd. Het liefst wil je natuurlijk gewoon al je files op 1 locatie hebben.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
het is niet zozeer dat hij address niet kan vinden; hij kan netifaces niet vinden vanuit die locatie.

overigens, is het niet handiger om een van de honderden python frameworks te gebruiken hiervoor? dan kan je inderdaad alles netjes op 1 locatie laten staan, en geeft je toegang tot allerlei handige tools.

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Je hebt helemaal gelijk, De module Netifaces was een egg file die in my home-dir was uitgepakt. Deze hidden file verplaatst naar /var/www en schrijfbaar gemaakt. Bedankt!

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
Je wilt waarschijnlijk dan ook kijken naar easy_install (en zijn betere broertje: pip) , om die modules system-wide te installeren :)

voor ubuntu is pip/easy_install simpel te installeren:

code:
1
2
sudo apt-get install python-setuptools
sudo easy_install pip