Dateien für "import-Anweisung" selbst erstellen un

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
gärchle
User
Beiträge: 5
Registriert: Freitag 14. August 2009, 10:24

Hi Python-Freaks,

ich bin neu im Forum und auch neu bei Python. Ich habe mir das Buch "Python für Kids" gekauft. Das geht auch soweit klar. Nur ist mal wieder alles ausschließlich für Windows erklärt. Ich benutze Suse-Linux 11.1.
Ich möchte erstellte Definitionen über eine import-Anweisung benutzen. Die kann man ja unter einem beliebigen Dateinamen abspeichern. Ich weiß nur nicht, wie ich diese Datei in den Suchpfad von Python bekomme. Eine sitecustomize.py existiert bei mir nicht. Wenn ich sie, wie im Buch vorgeschlagen, selbst erstelle, weiß ich allerdings nicht, wo ich sie abspeichern soll.
Gibt es bei Euch Linux-User die mir da helfen können.
Vielen Dank!
Gärchle
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

python -c 'import sys; print sys.path'
Wirft den Python-Suchpfad aus. ``sys.path`` ist eine Liste und kann auch im Programm veraendert werden.

Aber: Du musst Python-Skripte nicht im Suchpfad installieren. Willst du dein Modul aus einem anderen nutzen, reicht es, wenn die beiden im selben Ordner liegen.

Willst du dein Modul systemweit verfuegbar machen, dann schieb es in ``/usr/lib/python$Version/site-packages``

Daneben gibts noch das Modul ``virtualenv``, aber das geht glaube ich ein bisschen zu weit.
gärchle
User
Beiträge: 5
Registriert: Freitag 14. August 2009, 10:24

Hallo Cofi,

schonmal Danke.
Leider funktioniert es irgendwie nicht.
Kann es sein, dass in der Datei, deren Funktionen ich importieren will, irgendwas Spezielles drinstehen muss?
Ich arbeite mit IDLE und da steht immer drin "ImportError: cannot import name n_eck", wenn ich z.B. die Funktion" n_eck" mit "from mytools import n_eck" aufrufen will.

Gruß
Gärchle
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

gärchle hat geschrieben: Leider funktioniert es irgendwie nicht.
Es wäre sicherlich hilfreich zu wissen, welche Variante Du nun umgesetzt hast. Denn ja nach Umsetzung könnten andere Fehler da reinspielen.

Und: Vergiss doch idle! Nutze doch die normale Python-Shell oder iPython... imho komfortabler als idle.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Richtig. Beschreibe doch mal wie du das Skript ausfuehrst, wie das Verzeichnis des Skriptes aussieht und was in der ``mytools.py`` steht.

Was man zu IDLE erwaehnen sollte ist, dass es ein gewisses Gedaechtnis hat und das des oefteren Probleme macht. Zum Starten der Programme ist die Konsole zu bevorzugen.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Vergiss doch idle! Nutze doch die normale Python-Shell oder iPython... imho komfortabler als idle.
Das gilt aber auch nur unter Linux... Unter Windows fühlen sich beide Alternativen sehr fremd an.

EDIT: Ich seh grad, hier benutzt der OP tatsächlich Linux...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

HerrHagen hat geschrieben:
Vergiss doch idle! Nutze doch die normale Python-Shell oder iPython... imho komfortabler als idle.
Das gilt aber auch nur unter Linux... Unter Windows fühlen sich beide Alternativen sehr fremd an.
Findest Du wirklich? Worin unterscheiden sie sich denn zur Linux-Variante? Mir ist da bisher nichts gravierendes aufgefallen...
gärchle
User
Beiträge: 5
Registriert: Freitag 14. August 2009, 10:24

Also ich habe beide Varianten ausprobiert:

Einmal denselben Ordner benutzt, in dem ich auch meine Programme abspeichere. Das ist im Home-Verzeichnis. In diesem Ordner habe ich den Ordner mylib erstellt und darin die Datei mytools.py abgespeichert.

In der Datei mytools.py sind z.B. solche Definitionen:
def n_eck (eckenzahl, seitenlaenge):
drehwinkel = 360.0 / eckenzahl
for i in range (eckenzahl):
fd (seitenlaenge)
lt (drehwinkel)

Dann habe ich auch die Variante ausprobiert den Ordner mylib mit der Datei mytools.py unter /usr/lib/python$Version/site-packages`` abzuspeichern.
Hat leider auch nicht funktioniert.

Da ich mit dem besagten Buch Python lerne, habe ich mit der Konsole keine Erfahrung und natürlich auch keine Hilfestellung.
Gibt es eine Python relevante Befehlsübersicht für die Konsole?

Gruß
Gärchle
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Fuer Code gibt es [code][/code] Tags.

Schau dir mal den Abschnitt ueber Module im Tutorial an.

``python --help`` sollte dir alles erzaehlen.
Das wichtigste ist aber:
``python skript.py`` -> skript.py wird ausgefuerht.
``python`` -> Start des interaktiven Interpreters.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kein Wunder, dass es nicht klappt, wenn Du folgende Struktur verwendest:

Code: Alles auswählen

home
    +mylib
         mytools.py
     mein_script.py
Wenn Du nun in mein_script.py mytools importieren willst, musst Du schon entweder mytools.py aus dem mylib Ordner zurück in das home Verzeichnis kopieren, oder aber den Ordner mylib zu einem Modul machen. Dazu kannst Du eine (leere) __init__.py im Ordner mylib erstellen. Danach kannst Du dann folgenden import schreiben in der mein_script.py

Code: Alles auswählen

import mylib
# jetzt die Hierarchie beachten:
print mylib.mytools.drehwinkel

# oder
from mylib import mytools
print mytools.drehwinkel
Die __init__.py kann man in der Shell ganz einfach per

Code: Alles auswählen

touch mylib/__init__.py
erstellen. Das geht recht schnell im Vgl. zum Speichern einer leeren Datei aus einem Texteditor o.ä.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

gibt es denn nicht so ne Art sitecostumize.py wie in Python2.2.2?

in die hat man einfach den Pfad zur Lib hinzugefügt und dann konnt alles importiert werden
gärchle
User
Beiträge: 5
Registriert: Freitag 14. August 2009, 10:24

Dank an alle!

Ich habe jetzt die mytools.py im selben Ordner wie die Skripte. Außerdem arbeite ich jetzt mit der Konsole. Und siehe es funktioniert. Danke!

Ein kleiner Wermutstropfen: Ich arbeite in dem Buch viel mit dem turtle-Modul. Leider schließt das Fenster, das die Grafik anzeigt, sofort nach deren Fertigstellung. Kann man das ändern?

@Dav1d:
Nein, es gibt keine "sitecostumize.py" bei Linux.

Gruß
Gärchle
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

gärchle hat geschrieben:Ich habe jetzt die mytools.py im selben Ordner wie die Skripte. Außerdem arbeite ich jetzt mit der Konsole. Und siehe es funktioniert. Danke!
Das Problem ist, dass du mit extra Ordnern ein Package benutzen musst. Hyperion hat das ja schon erklaert - allerdings ohne den Namen zu erwaehnen.
Wie gesagt: Mehr dazu gibt es im Tutorial im Modul-Kapitel.
gärchle hat geschrieben:Ein kleiner Wermutstropfen: Ich arbeite in dem Buch viel mit dem turtle-Modul. Leider schließt das Fenster, das die Grafik anzeigt, sofort nach deren Fertigstellung. Kann man das ändern?
Das sollte allerdings nicht passieren, wenn du aus der Konsole startest. Zeig mal den Code, bei dem das passiert.
gärchle hat geschrieben:@Dav1d:
Nein, es gibt keine "sitecostumize.py" bei Linux.
Ist auch gar nicht noetig. Python bedient sich der PYTHONPATH-Umgebungsvariable.

Code: Alles auswählen

export PYTHONPATH='$PYTHONPATH:new_path'
in der .bashrc reicht.
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo

du musst deinem Skript als letzte Anweisung ein

Code: Alles auswählen

mainloop()
mit geben,also in etwas so

Code: Alles auswählen

def haus(seite):
    fd(seite)
    rt(90)
    fd(seite)
    lt(120)
    fd(seite)
    lt(120)
    fd(seite)
    lt(75)
    fd(seite * sqrt(2))
    lt(135)
    fd(seite)
    lt(135)
    fd(seite * sqrt(2))
    lt(135)
    fd(seite)
    pu()
    home()
    hideturtle()

speed(1)
haus(100)
mainloop()
Siehe auch im Buch Seite 409 bzw 399

Gruß...busfahrer
Alles wird gut ;-)
gärchle
User
Beiträge: 5
Registriert: Freitag 14. August 2009, 10:24

@busfahrer:
Jop. Funktioniert und Danke. Ich bin halt erst bei Kapitel 8. :?
Somit bin ich erstmal glücklich und kann in Ruhe weiterarbeiten.
So long.

Gärchle
Antworten