from spam.ham import eggs >> __import__(...)

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

In der Doku steht was von
"from spam.ham import eggs" results in "__import__('spam.ham', globals(), locals(), ['eggs'])"

Aber anscheinend macht er das nicht so wie ich das will:

hab folgende Verz.Struktur:

./index.py - Aus der teste ich __import__
./PyLucid_modules/__init__.py - Ist leer
./PyLucid_modules/pageadmin.py - Das Modul was ich eigentlich haben will

Ich will from PyLucid_modules import pageadmin umsetzten:

Code: Alles auswählen

            module_package  = "PyLucid_modules"
            module_name     = "pageadmin"
            module = __import__( module_package, globals(), locals(), [module_name] )
            help(module)
modul ist dabei nicht PyLucid_modules.pageadmin sondern PyLucid_modules.__init__ :(
Generell scheind es egal zu sein, was man bei hinten angibt:

Code: Alles auswählen

__import__( "PyLucid_modules", globals(), locals(), ["gibt_es_nicht"] )
Liefert mir auch PyLucid_modules.__init__

Muß ich die __init__.py in dem Fall mal mit leben füllen???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nach dem ich das http://starship.python.net/pipermail/py ... 01170.html gefunden hab, hab ich die Lösung:

Code: Alles auswählen

            module_package  = "PyLucid_modules"
            module_name     = "pageadmin"
            module = __import__( "%s.%s" % (module_package,module_name), globals(), locals(), [module_name] )
Warum das so sein muß?!?!? Nagut, so geht's aber...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nun hab ich da doch noch ein Problem :(

In PyLucid_modules.pageadmin existiert eine PseudoKlasse module_info und nur diese will ich importieren, also quasi sowas:

Code: Alles auswählen

from PyLucid_modules import pageadmin.module_info
oder auch

Code: Alles auswählen

from PyLucid_modules.pageadmin import module_info

Das ganze allerdings mit __import__(). Aber das klappt nicht so wie ich will. Was geht ist:

Code: Alles auswählen

module_package  = "PyLucid_modules"
module_name     = "pageadmin"
module = __import__(
    "%s.%s" % (module_package,module_name),
    globals(), locals(),
    [module_name]
)
module_data = module.module_info
Was nicht geht ist:

Code: Alles auswählen

module_data = __import__(
    "%s.%s.module_info" % (module_package,module_name),
    globals(), locals(),
    ["module_info"]
)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

jens hat geschrieben:In der Doku steht was von
"from spam.ham import eggs" results in "__import__('spam.ham', globals(), locals(), ['eggs'])"

Aber anscheinend macht er das nicht so wie ich das will:

hab folgende Verz.Struktur:

./index.py - Aus der teste ich __import__
./PyLucid_modules/__init__.py - Ist leer
./PyLucid_modules/pageadmin.py - Das Modul was ich eigentlich haben will

Ich will from PyLucid_modules import pageadmin umsetzten:
Das läuft aber nicht so! Dann musst du in der Datei PyLucid_modules.py die Klasse pageadmin haben. In deinem Aufbau könntest du lediglich
from PyLucid_modules.pageadmin import *

Das einzige, was du machen kannst wäre in die Datei PyLucid_modules/__init__.py folgendes zu schreiben. from pageadmin import *. Dann muss allerdings auch in pageadmin.py die Klasse pageadmin exsistieren.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Soll das heißen, das man mit __import__ nur dann eine Klasse in einer Datei gezielt importieren kann, wenn die Datei und die Klasse gleich heißen???

Ich möchte ja nun nur eine Klasse importieren. s. http://www.python-forum.de/viewtopic.php?p=20843#20843

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

jens hat geschrieben:Soll das heißen, das man mit __import__ nur dann eine Klasse in einer Datei gezielt importieren kann, wenn die Datei und die Klasse gleich heißen???
Nein! Gehen wir mal von deinen Aufbau da oben aus.

./index.py
./PyLucid_modules/__init__.py <- Ist leer
./PyLucid_modules/pageadmin.py <- hier ist jetzt die Klasse asdf drinn

Dann kommst du an die Klasse asdf mit

Code: Alles auswählen

from PyLucid_modules.pageadmin import asdf
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

ProgChild hat geschrieben:Dann kommst du an die Klasse asdf mit

Code: Alles auswählen

from PyLucid_modules.pageadmin import asdf
Das ist mir klar... Nur wie bekomme ich das gleiche mit __import__ hin? Die Namen liegen bei mir alle als String's vor ;)

So geht's jedenfalls nicht:

Code: Alles auswählen

module_package = "PyLucid_modules"
module_name = "pageadmin"
module_data = __import__(
    "%s.%s.asdf" % (module_package,module_name),
    globals(), locals(),
    ["asdf"]
)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

jens hat geschrieben:So geht's jedenfalls nicht:

Code: Alles auswählen

module_package = "PyLucid_modules"
module_name = "pageadmin"
module_data = __import__(
    "%s.%s.asdf" % (module_package,module_name),
    globals(), locals(),
    ["asdf"]
)
Aber so sollte es gehen:

Code: Alles auswählen

module_package = "PyLucid_modules"
module_name = "pageadmin"
module_data = __import__(
    "%s.%s" % (module_package,module_name),
    globals(), locals(),
    ["asdf"] )

# Jetzt eine Instanz von asdf erstellen:
instanz = module_data.asdf()

Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Na, ich weiß nicht... Es besteht schon ein unterschied!

Auch in deinem Beispiel, representiert module_data die gesammte "Datei" und nicht nur die Klasse "asdf" :(

Wärend ein "from ... import asdf" wirklich nur die Klasse importiert.

Das kann man ganz gut mit help() überprüfen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Mit `__import__()` importiert man immer ein Modul. Das sagt die (eingebaute) Doku aber auch recht deutlich. Wo genau liegt denn jetzt Dein Problem? Du kannst die Klasse ja immer noch an einen Namen in Deinem Modul binden, wenn Du das möchtest.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das ganze ist für ein Module-Manager. Dabei benötige ich erstmal nur, von jedem Modul/Plugin, ein Dict aus einer Pseudo-Klasse und nicht das ganze Modul.

Bisher mache ich das so:

Code: Alles auswählen

    def get_module_data( self, package_name, module_name ):
        """Daten aus der pseudo Klasse 'module_info' holen"""
        return __import__(
            "%s.%s" % (package_name,module_name),
            globals(), locals(),
            ["module_info"]
        ).module_info.data
Ist das jetzt die sauberste Lösung???

In dem Zusammenhang habe ich auch noch ein Problem, an die eigentlichen Dateinamen zu kommen, siehe: http://www.python-forum.de/viewtopic.php?p=20826#20826

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten