Bekomme keine Ausgabe mit wx.StandardPaths

Plattformunabhängige GUIs mit wxWidgets.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Seit einigen Tagen arbeite ich unter Ubuntu (Dapper Drake).

Folgender Code spuckt mir nur "starte..." aus. Weiß jemand, woran das liegen könnte?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx

print 'starte...'

sp = wx.StandardPaths.Get()
wx.GetApp().SetAppName("AppName")
print wx.GetApp().GetAppName()

for x in ['GetConfigDir',
          'GetUserConfigDir',
          'GetDataDir',
          'GetLocalDataDir',
          'GetUserDataDir',
          'GetUserLocalDataDir',
          'GetPluginsDir',
          'GetInstallPrefix',
          ]:
    func = getattr(sp, x)
    print func()
Wenn ich Python in der Konsole starte und

Code: Alles auswählen

import wx
sp = wx.StandardPaths.Get()
eingebe, schließt sich die Konsole nach einem Enter am Ende der 2. Zeile !!

[EDIT]
Vielleicht hilft der Hinweis, dass ich das Paket "wx2.6-examples" installiert habe und dort in der wxPython Demo das Beispiel zu den Standardverzeichnissen funktioniert!?

Viele Grüße
Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Weiß jemand, woran das liegen könnte?
Hi Jamil!

Der erste WX-Befehl muss immer das Starten der wx-Applikation sein.

Code: Alles auswählen

app = wx.PySimpleApp()
Natürlich gibt es auch Ausnahmen:

Code: Alles auswählen

wx.SetDefaultPyEncoding("utf-8")
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold!

Vielen Dank, das wusste ich nicht.

Ich habe nun leider noch ein anderes Problem.
Unter Windows habe ich keine Probleme gehabt, wenn ich ein Verzeichnis

Code: Alles auswählen

C:\Dokumente und Einstellungen\Anwendungsdaten\AppName
einen Ordner aus Python heraus anlegen wollte (auch wenn der angemeldete Benutzer keine Administratorrechte hatte). Unter Linux ist das passende Verzeichnis

Code: Alles auswählen

/etc/AppName
Doch hier gelten folgende Rechte

Code: Alles auswählen

drwxr-xr-x 114 root root  4096 2006-12-18 18:33 etc
Wenn ich aus Python heraus in diesem Verzeichnis mittels os.mkdir() ein Verzeichnis anlegen möchte kommt die Meldung

Code: Alles auswählen

OSError: [Errno 13] Permission denied: '/usr/share/AppName'
Um mein Programm plattformübergreifend zu machen, benötige ich aber einen Ordner, wo alle Schreibrechte haben.

Ungern würde ich es mit

Code: Alles auswählen

sudo chmod 0777 /etc
lösen.

Wie geht man hier vor?

Vielen Dank im Voraus!
Jamil
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Die Zugriffsrechte unter Linux kannst du nicht umgehen -- sonst waeren sie ja auch sinnlos. Und das mit dem sudo vergiss bitte ganz schnell wieder. :shock:

Das /usr -Verzeichnis ist fuer "feste" Daten, also alles, was einmal installiert wird und dann nicht mehr geaendert wird. Deswegen hat nur root dort Schreibrechte. Genaueres ueber die Verzeichnissgtruktur von Linux gibts z.B. hier: http://www.linuxfibel.de/dirstruct.htm.

Fuer Daten, die sich im Laufe der Anwendung aendern, ist das home-Verzeichnis da (oder /tmp). Viele Linux-Anwendungen erstellen sich ein Verzeichnis ~/.myAppName fuer Konfigurations-Dateien/Speichern von Einstellungen, fuer sonstige Daten fragt man den User.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Rebecca!

Danke für die Tipps, das mit dem "sudo" war nicht ganz ernst gemeint. Und das Homeverzeichnis ansich ist auch geschützt.

Code: Alles auswählen

import os
os.mkdir('/home/AppName')
geht genauso wenig.

Die Daten sollen aber in dem geplanten Verzeichnis unabhängig vom Benutzer und mit der Installation entstehen.

Wo packe ich meine Programmdateien überhaupt am besten hin?
/opt ?

[EDIT]
Das einzige Verzeichnis neben /home/<benutzer>/
ist /tmp, wo jeder alles darf :-(

Gruß
Jamil
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JR hat geschrieben:Wo packe ich meine Programmdateien überhaupt am besten hin?
/opt ?
/opt vergisst du ganz schnell, das ist IMHO nur eine schlechte Idee aus Nürnberg gewesen. Du musst wohl einen Ordner mit den passenden Rechten irgendwo in /var anlegen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Das geißt, wenn ich einen "Installer" von meinem Programm erstellen möchte, muss ich davon ausgehen, dass er mit root-Rechten ausgeführt wird und erst einmal einen entsprechenden Ordner anlegt und dort allen alle Rechte gibt?

Jamil
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

JR hat geschrieben:

Code: Alles auswählen

import os
os.mkdir('/home/AppName')
geht genauso wenig.
Ich meinte schon /home/benutzer...
JR hat geschrieben:Die Daten sollen aber in dem geplanten Verzeichnis unabhängig vom Benutzer und mit der Installation entstehen.
Wenn die Daten mit der Installation entstehen und danach unveraendert bleiben, kannst du sie natuerlich in /usr/ oder /opt packen. Denn man geht normalerweise davon aus, dass root Programme installiert, somit waere das mit den Benutzerrechen kein Problem. Alternativ ist es natuerlich sinnvoll, dass ein Benutzer, der keine Root-Rechte hat (z.B. an der Uni, in der Firma,...) das Programm trotzdem installieren kann, da muss natuerlich alles (!) in das /home-Verzeichnis des Benutzers. Da koennte man beim Installationsvorgang eine extra Optionen fuer vorsehen...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JR hat geschrieben:Das geißt, wenn ich einen "Installer" von meinem Programm erstellen möchte, muss ich davon ausgehen, dass er mit root-Rechten ausgeführt wird und erst einmal einen entsprechenden Ordner anlegt und dort allen alle Rechte gibt?
Es reicht wenn die entsprechende Gruppe die richtigen Rechte hat, aber so ganz allgemein: ja, das bedeutet es.
Wäre ja auch noch schöner, wenn irgendwelche dahergelaufenen User zum Spaß irgendwo im Dateisystem ihre Daten ablagern würden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

JR hat geschrieben:Das geißt, wenn ich einen "Installer" von meinem Programm erstellen möchte, muss ich davon ausgehen, dass er mit root-Rechten ausgeführt wird
Ja.
und erst einmal einen entsprechenden Ordner anlegt und dort allen alle Rechte gibt?l
Nein! Lesen koennen in /usr und so weiter ja alle. Wie gesagt, Daten, die nach der Installation von den Benutzern noch veraendert werden, gehoeren in deren Home-Verzeichnisse!
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Okay, ich unterscheide halt nach OS.

Bei Windows bleibt es

Code: Alles auswählen

C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AppName
unter Linux
Merke gerade einen Mist:
Man kann darüber streiten, ob Eclipse mit dem Plugin PyDEV zum Entwicklen mit Python toll ist oder nicht. Mir hat es bisher sehr gefallen. Allerdings ist es unter Linux im Gegensatz zu Windows unakzeptabel lahm :-(

Gruß
Jamil
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JR hat geschrieben:Man kann darüber streiten, ob Eclipse mit dem Plugin PyDEV zum Entwicklen mit Python toll ist oder nicht. Mir hat es bisher sehr gefallen. Allerdings ist es unter Linux im Gegensatz zu Windows unakzeptabel lahm :-(
Also haben wir noch jemanden, den wir zu Emacs und Vim konvertieren können. Vim läuft unter jedem System schnell :D

Allerdings verstehe ich nicht, warum du unter Windows in All Users schreibst und nicht in ~. Das ist simpel, verständlich und von vielen Programmen so übernommen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Die Begründung ist einfach.
Das Programm läuft in zwei Sprachen. Die Sprachdateien möchte ich nicht für jeden Systembenutzer einzeln auf die Platte legen. Daher ein allgemeines Verzeichnis für alle Anwender. Das ist doch auch ganz üblich so.

Insgesamt gibt es eh zwei Mal plus 2 mal die Anzahl an Systembenutzern das Verzeichnis "Anwendungsdaten" unter Windows.
Jeweils lokal und im Netzwerk einmal für jeden Systembenutzer und dann nochmal für alle Benutzer.
Die *.ini-Datei meiner Software oder alle verwendeten Icons möchte ich doch nur ein einziges Mal während der Installation auf die Platte schreiben.

Gruß
Jamil
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Sprachdateien wuerdest du unter Linux aber auch nicht in ~ lagern, sondern in /usr/share oder so. Wie gesagt, root installiert das Programm, legt dabei /usr/share/myApp an mit den entprechenden Inhalten. Danach koennen alle User lesend drauf zugreifen, was fuer Sprachdateien ja auch ausreicht. Nur aendern (also schreibend zugreifen) duerfen die User /usr/share/myApp nich mehr.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JR hat geschrieben:Die Begründung ist einfach.
Das Programm läuft in zwei Sprachen. Die Sprachdateien möchte ich nicht für jeden Systembenutzer einzeln auf die Platte legen. Daher ein allgemeines Verzeichnis für alle Anwender. Das ist doch auch ganz üblich so.
Nein, Sprachdateien sind Teil des Programmes und sollten entweder unter Windows im Ordner mit dem Rest ges programmes sein oder unter anderen Systemen dort wo Sprachdateien untergebracht werden (wie Rebecca bereits sagte).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Okay und was ist mit der Konfigurationsdatei, welche u.a. die Fensterposition, ausgewählte Sprache etc. speichert? Die muss ich in ein Verzeichnis legen, wo alle Benutzer Schreibrechte haben.

Wie kann ich denn überhaupt einen Installer entwicklen, der so einen Ordner anlegen kann?
Soll ich im Installer ein os.mkdir(pfad) und os.system(chmod 0777 pfad) versuchen und wenn es nicht klappt eine Meldung bringen, dass der Benutzer root den Installer ausführen soll?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JR hat geschrieben:Okay und was ist mit der Konfigurationsdatei, welche u.a. die Fensterposition, ausgewählte Sprache etc. speichert? Die muss ich in ein Verzeichnis legen, wo alle Benutzer Schreibrechte haben.
Im User-Ordner, wo denn sonst? Also mich würde es ärgern, wenn alle User des Computers sich die Konfigruation gegenseitig überschrieben würden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Nein, dass Programm wird zwar von verschiedenen Personen aber letztlich einem Flugverein eingesetzt.
Das Intervall für automatische Datenbanksicherungen auf einen USB-Stick soll einheitlich sein. Auch sonstige Einstellungen möchte ich zentral speichern.
Das machen doch ganz viele Programme so. Die Ordner

Code: Alles auswählen

C:\Dokumente und Einstellungen\All Users\Anwendungsdaten
und

Code: Alles auswählen

C:\Dokumente und Einstellungen\Lokale Einstellungen\All Users\Anwendungsdaten
gibt es doch genau aus diesem Grund.

Gruß
Jamil
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Der Standardfall sieht in Linux etwa so aus: Nehmen wir mal an, man moechte den TextEditor MyEditor auf einem Linxsystem installieren. Den Installiervorgang sollte normalerweise von root ausgefuehrt werden. Der "Installer" oder was auch immer kann dann Verzeichnisse /usr/MyEditor, /usr/share/MyEditor/, /usr/doc/MyEditor etc anlegen und mit Inhalt fuellen, weil er ja als root ausgefuehrt wird.

Systemweite Einstellungen (solche, die fuer alle User gleich sind), gehoeren in /etc/MyEditor und werden ebenfalls von root vorgenommen. Es waere ja noch schoener, wenn jeder User die Systemweiten Einstellungen aendern koennte! Sowas ist Sache des Administrators eines Systems, also root.

Einstellungen, die fuer jeden Nutzer unterschiedlich sind (z.B. Fenstergroesse, zuletzt geoffnete Dateien, seine ausgewaehlte Schriftart/Farbe etc. kommen in ~, das geht die anderen User nix an uns soll von ihnen ja auch nicht geaendert werden koennen.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Ich kann Rebecca in diesem Fall nur zustimmen.

Ich weiss ja nicht obs hilfreich ist, aber:
Gimp hat zum Beispiel unter Windows in root:\$PROGRAMS$\Gimp2.0\
die (fast) gleiche Verzeichnisstruktur wie unter Linux, nämlich:
\Gimp-2.0\
|
|--> bin
|--> etc
|--> lib
|--> share

Warum nicht so? Dann bist du 100% Linux-Konform (dein Programm wird also unter Linux ganz sicher laufen) und Windoof ist es egal, welche Ordnerstruktur du innerhalb des Programmordners hast.

Nur der ~ macht noch Probleme, aber selbst das ist nicht so schwierig. Natürlich wäre es gut, wenn Windows endlich lernen würde, Ordner, die mit einem Punkt beginnen, auszublenden. Dann könnte man getrost unter $HOME$ Ordner und Configs anlegen.
Gruß!
Antworten