PyEnv (Last Try):

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Also,
Ich ist sicher aufgefallen das ich euch in letzter Zeit mal wieder besonders auf den Sack gehe. Das hat einen ganz einfachen Grund:

Ich probiere momentan eine sogeannten "Python Environment" zu schreiben, oder auch
kurz pyEnv. Was ist das?

Nun Ich habe mir das so vorgestellt:
Man startet ein main script diese stellt dir eine Konsole bereit. In dieser Konsole
kannst du besimmte Befehle aufrufen und diesen gleich bestimmte Parameter übergeben.
Z.b:

Code: Alles auswählen

>>> add 5 10
15
>>> 
Dabei sollen die Befehle wie Plugins erweiterbar sein. Also ich schreibe z.B ein Script
in diesem ist eine Funktion definiert die dann nachher in der Konsole abrufbar ist.

Dieser "Plugin"-Ordner hieße dann Callbacks. Warum "Callbacks"? Weil ich es intern so realisiert habe:

Code: Alles auswählen

#!/usr/bin/python

import os

class CommandParser(object):
    def __init__(self):
        self.callbacks = {}
        
    def register_callback(self, command, callback):
        self.callbacks[command] = callback
        
    def parse(self, string):
        tokens = string.split()
        command = tokens[0].lower()
        
        if self.callbacks.has_key(command):
            self.callbacks[command](tokens[1:])
            print
            
parser = CommandParser()

##############################################################################
#Register Callbacks:
##############################################################################

while True:
    command = str(raw_input('>>> '))
    
    if command:
        parser.parse(command)
Das heißt man "registriert" intern eine Referenz an eine bestimmte Funktion von
irgendwo und macht sie mit einem Namen abrufbar.
Z.b:

Code: Alles auswählen

def exit():
    import sys #Unschön, Ich weiß
    
    print 'Ende.'
    sys.exit()
parser.register_callback('exit', exit)

...

>>> exit
Ende.
Jetzt habe ich es mir aber noch komplizierter gemacht. Manche meiner Scripte
brauchen nämlich z.B bestimmte Dateien mit denen sie arbeiten können und
Einstellungen die sie Abrufen können. (Z.b wenn ich mit meinem Modul pyTiddlyWikiarbeiten will)

Das heißt in dem Callbacks Ordner wird für jede Funktion ein weiter Unterordner erstellt
der den Namen der Funktion trägt. Also z.b:

Code: Alles auswählen

callbacks
    exit
        files
        settings
Außerdem könnte, (oder sollte) man noch neben callbacks einen Ordner Depencies
erstellen damit pyEnv relativ portable bleibt. (Z.b BeautifulSoup) nach:

Code: Alles auswählen

depencies
    BeautifulSoup.py
und nachher in der __init__.py in dem callbacks ordner den sys.path auf depencies erweitern. (Falls das so möglich ist)

Jetzt brauche ich im Prinzip also folgendes:
Wenn pyEnv.py gestartet wird (Die Console) muss es alle Module in 'config/callbacks'
finden und importieren. Danach muss es die in den Modulen verfügbaren funktionen mittels:

Code: Alles auswählen

parser.register_callback(command, name)
registrieren und dadurch
abrufbar machen.
Die Scripte in Callbacks laden sich dann ggf. ihre Einstellungs-Daten
aus den "files" und "settings" Ordner wenn sie aufgerufen werden.

Wenn niemand die Zeit findet das zu lesen, kein Problem.
Wenn es niemand verstanden hat, macht euch nichts daraus.
Wenn mir jemand helfen könnte, toll.

Mfg,
CracKPod
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich glaube nicht, dass du innerhalb eines Python-Prozesses verschiedene - womöglich noch gegeneinander abgeschottete - Kommandos mit unterschiedlichen Abhänigkeiten realisieren kannst.

Aber vielleicht hilft dir etwas wie virtualenv eine Art Python-Shell zu bauen, die dann für jedes Kommando nochmal einen eigenen Python-Prozess startet.

Stefan
Antworten