universelle Pfad Angaben unter verschiedenen BS

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.
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

universelle Pfad Angaben unter verschiedenen BS

Beitragvon nihilist » Mittwoch 21. März 2007, 21:17

Guten Abend,
Diese Frage wurde bestimmt schon gestellt und auch beantwortet, konnte aber über die Suche nichts passendes finden.
Ich möchte einfach eine Textdatei im jeweiligen /home/ Verzeichniss des Benutzers anlegen.
Ich habe mir das so vorgestellt

Code: Alles auswählen

if os.name == 'posix':
   file = '~.simmsave'
elif os.name == 'nt':
   file = '/Ordner/des/Benutzers/simmsave'

Unter Linux kann ich ja mit cd ~ in das /home des Benutzers wechseln, wenn ich das so wie oben benutze geht es aber nicht.
Unter Windows weiss ich nicht mal wie die relevanten Ordner heissen, kann mir da jemand auf die Sprünge helfen?
Wäre nett, danke
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Mittwoch 21. März 2007, 21:35

[wiki]Profilpfad herausfinden[/wiki]
TUFKAB – the user formerly known as blackbird
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

Beitragvon nihilist » Mittwoch 21. März 2007, 22:20

Danke, ich erinnere mich diese Seite schon mal gesehen zu haben... ;-)
Ich stehe trotzdem noch auf dem Schlauch:
Mit:

Code: Alles auswählen

def get_settings_folder(appname):

    # resolve settings folder
    if os.name == 'posix':
        folder = os.path.join(os.environ.get('HOME'), "." + appname.lower())
    elif os.name == 'nt':
        folder = os.path.join(os.environ.get('APPDATA'), appname.capitalize())
    else:
        folder = os.path.join(os.getcwd(), appname)

    # create settings folder if necessary
    try:
        os.mkdir(folder)
    except OSError:
        pass

    return folder
moviefile = get_settings_folder("simm")

erstellt er mir ja einen Ordner mit dem Namen ".simm" im /home Verzeichniss.
Wenn ich nun aber in diesem Ordner eine Textdatei (Schliesslich sollen die Daten ja in der Textdatei gespeichert werden) erstellen möchte, weiß ich nicht wie ich da Vorgehen soll.
Ich hab mir sowas primitives wie

Code: Alles auswählen

path= get_settings_folder("simm")
file = path/.simmsave

vorgestellt. Natürlich scheiterts wieder daran das ich nicht weiß, wie die korrekte Syntax lautet...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: universelle Pfad Angaben unter verschiedenen BS

Beitragvon gerold » Donnerstag 22. März 2007, 00:32

nihilist hat geschrieben:Ich möchte einfach eine Textdatei im jeweiligen /home/ Verzeichniss des Benutzers anlegen.

Hallo nihilist!

In diesem Beitrag http://www.python-forum.de/post-50638.html#50638 handelt es sich um ein ähnliches Problem. Allerdings in Verbindung mit wxPython.

Kurze Erklärung:
Unter Linux ist alles recht klar. Eine Dilde "~" kennzeichnet den Home-Ordner des aktuellen Benutzers. Programme können unterhalb dieses Ordners sichtbare oder unsichtbare Ordner oder Dateien mit Einstellungen ablegen.

Ein ``os.path.expanduser("~")`` gibt unter Linux den oben besprochenen Home-Ordner des aktuellen Benutzers zurück. Unter Windows XP gibt dieser Befehl ebenfalls den Home-Ordner des aktuellen Benutzers zurück. Allerdings ist es nicht erwünscht, dass innerhalb dieses Ordners von Programmen Einstellungen abgelegt werden.

Bei mir ist der Home-Ordner z.B. 'J:\\Dokumente und Einstellungen\\Gerold'.

Unter Windows ist es ein wenig komplizierter, da man Windows für "Wandernde Benutzer" so konfigurieren kann, dass die Programmeinstellungen nicht nur auf dem lokalen Computer, sondern auf jedem Computer im Netz, auf dem ich mich anmelde, zur Verfügung stehen. Zu diesem Zweck gibt es eigene Registry-Schlüssel, und eigene Ordner, mit Einstellungen, die von einem Windows-Server (ActiveDirectory oder Domain-Controler) verwaltet werden und beim Anmelden an einen Computer an den Client-Computer übermittelt werden.

Damit es kein Durcheinander gibt, muss man die Art der Einstellungen unterscheiden. Fensterposition und Größe sind Einstellungen, die nur auf dem lokalen Computer Sinn machen, da andere Computer andere Monitorauflösungen haben könnten. Auch eine Liste mit zuletzt geöffneten Dateien sollte lokal bleiben und nicht an andere Computer übermittelt werden, da es ja nicht ausgeschlossen ist, dass ein Pfad nur auf dem lokalen Computer zur Verfügung steht.

Als Beispiel: Wenn du einen Browser programmierst, dann sind Position und Größe des Browserfensters lokale Einstellungen. Die Favoriten/Bookmarks und die zuletzt eingegebenen URLs sind Einstellungen, die auch an andere Computer, an denen du dich anmeldest, übermittelt werden sollen.

Der Pfad zum Hauptordner für "Wandernde Benutzereinstellungen" lässt sich über die Umgebungsvariable "APPDATA" erfragen. Aber leider gibt es keine Umgebungsvariable, die den Hauptordner für "Lokale Benutzereinstellungen" zurück gibt.

wxPython hat dafür ``wx.StandardPaths``. Damit lassen sich die Ordner genau bestimmen:

Code: Alles auswählen

>>> import wx
>>> app = wx.PySimpleApp()
>>> app.SetAppName("MyApp")
>>> wx.StandardPaths_Get().GetUserDataDir()
u'J:\\Dokumente und Einstellungen\\Gerold\\Anwendungsdaten\\MyApp'
>>> wx.StandardPaths_Get().GetUserLocalDataDir()
u'J:\\Dokumente und Einstellungen\\Gerold\\Lokale Einstellungen\\Anwendungsdaten\\MyApp'
>>>


Ich empfehle deshalb, besonders bei GUI-Anwendungen mindestens eine Datei mit "lokalen Einstellungen" und eine mit "Einstellungen" zu verwenden.

Kann man wxPython nicht heranziehen, dann ist die Funktion ``get_settings_folder()`` [wiki]Profilpfad herausfinden[/wiki]auf jeden Fall viel besser, als alles in den Home-Ordner des Benutzers zu schreiben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 22. März 2007, 00:36

nihilist hat geschrieben:Wenn ich nun aber in diesem Ordner eine Textdatei (Schliesslich sollen die Daten ja in der Textdatei gespeichert werden) erstellen möchte, weiß ich nicht wie ich da Vorgehen soll.


Dafür habe ich diesen Link: http://www.python-forum.de/topic-6157.html

Und wenn du Einstellungen speichern möchtest, dann ist dieser Link interessant: http://docs.python.org/lib/module-ConfigParser.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

Beitragvon nihilist » Donnerstag 22. März 2007, 01:50

Oh, Ich muss mich entschuldigen, eigentlich hatte blackbird meine Frage mit seinem Link schon beantwortet, ich war nur zu doof um das "create settings folder" wegzulassen, da ich nur eine textdatei benötige.
Daher tuts der Aufruf

Code: Alles auswählen

file = get_settings_folder("simmsave")

für mich, und das dürfte dann ja wohl auch unter Windows erst mal funktionieren.

Auf jeden Fall Danke für deine sehr ausführliche Antwort, ich denke für das Programm das ich gerade schreibe genügt "get_settings_folder()". Ich versuche mich erst ohne GUI zurecht zufinden, alles andere kommt später, und da werden deine Ausführungen bestimmt von Nutzen sein.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 22. März 2007, 14:57

Übrigens: Das Builtin ``file`` mit eigenen Namen zu überdecken ist nie eine gute Idee.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: __deets__