Seite 1 von 2

Bekomme keine Ausgabe mit wx.StandardPaths

Verfasst: Montag 18. Dezember 2006, 17:46
von JR
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

Re: Bekomme keine Ausgabe mit wx.StandardPaths

Verfasst: Montag 18. Dezember 2006, 19:58
von gerold
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
:-)

Permisson denied beim Anlegen eines Programmverzeichnisses

Verfasst: Montag 18. Dezember 2006, 21:47
von JR
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

Verfasst: Montag 18. Dezember 2006, 22:21
von Rebecca
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.

Verfasst: Montag 18. Dezember 2006, 22:29
von JR
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

Verfasst: Montag 18. Dezember 2006, 22:34
von Leonidas
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.

Verfasst: Montag 18. Dezember 2006, 22:37
von JR
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

Verfasst: Montag 18. Dezember 2006, 22:38
von Rebecca
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...

Verfasst: Montag 18. Dezember 2006, 22:39
von Leonidas
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.

Verfasst: Montag 18. Dezember 2006, 22:41
von Rebecca
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!

Verfasst: Montag 18. Dezember 2006, 22:45
von JR
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

Verfasst: Montag 18. Dezember 2006, 22:52
von Leonidas
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.

Verfasst: Montag 18. Dezember 2006, 23:08
von JR
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

Verfasst: Montag 18. Dezember 2006, 23:15
von Rebecca
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.

Verfasst: Dienstag 19. Dezember 2006, 17:41
von Leonidas
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).

Verfasst: Dienstag 19. Dezember 2006, 17:46
von JR
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?

Verfasst: Dienstag 19. Dezember 2006, 17:52
von Leonidas
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.

Verfasst: Dienstag 19. Dezember 2006, 18:35
von JR
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

Verfasst: Dienstag 19. Dezember 2006, 19:08
von Rebecca
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.

Verfasst: Mittwoch 20. Dezember 2006, 16:43
von C4S3
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.