Hallo,
vielleicht eine zu einfache Frage, aber ich finde einfach nichts Brauchbares!
Problem:
In meinem Python Programm möchte ich gerne Files aus Unterverzeichnissen meines Programms lesen. Hierfür möchte ich Konstanten an einen QFileDialog().getOpenFileName(...) mit "directory=KONSTANTE_XYZ" übergeben.
Mit absoluten Pfaden funktioniert das,
ohne Pfad-Angabe lande ich im Programm-Verzeichnis (logisch !).
Wenn ich aber z.B. directory='./daten' übergebe, klappt das nicht und ich lande trotzdem im "Arbeits-Verzeichnis".
Wie definiert man in Python relative Pfadangaben ?
Viele Grüße
mephisto-online
Relative Datei-System-Pfade ?
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Genauer gesagt: Jedes Modul hat ein eigenes `__file__` das den Dateipfad des Moduls enthaelt. Mittels `modul.__file__` kann man dann noch auf andere Module zugreifen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 167
- Registriert: Sonntag 29. September 2013, 17:05
Das hatte ich eigentlich auch so gelesen. Aber:
sagt mir '__main__', weil main.py. Nicht den Pfad !
Code: Alles auswählen
print(self.__file__)
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Die einzige Stelle bei der man "__main__" erwarten kann, ist das `__name__` des "Startskriptes".
Wie du auf die Erklaerung kommst, dass es "__main__" ist, weil die Datei "main.py" heisst ist mir schleierhaft ... ich sehe da zumindest erhebliche Unterschiede zwischen den beiden Namen.
Und falls Sirius' Antwort zu subtil ist: Solange `self` nicht der Name eines Moduls ist, bist du fehl am Platz. Der Name ist `__file__`.
Wie du auf die Erklaerung kommst, dass es "__main__" ist, weil die Datei "main.py" heisst ist mir schleierhaft ... ich sehe da zumindest erhebliche Unterschiede zwischen den beiden Namen.
Und falls Sirius' Antwort zu subtil ist: Solange `self` nicht der Name eines Moduls ist, bist du fehl am Platz. Der Name ist `__file__`.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 167
- Registriert: Sonntag 29. September 2013, 17:05
Ja sorry, hatte mich mal wieder selbst gefoppt ...
self.__file__ gibt es natürlich nicht !
Aber __file__ :
Liefert Filenamen mit Pfad. Muss ich den jetzt "splitten", den Python-Filenamen entfernen und dann meinen Java-Daten-Verzeichnisnamen anfügen ? Oder geht das auch " eleganter ? (Eigentlich ist Python ja schon "elegant" genug ! )
Aber wie komme ich in MainWindow() da dran ? Parameter ?
self.__file__ gibt es natürlich nicht !
Aber __file__ :
Code: Alles auswählen
JAVA_DAT_DIR = './Daten' # ????
...
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
...
def import(self):
file_dialog = QFileDialog()
file_name = file_dialog.getOpenFileName(self,
caption='Import ajd ...',
directory=JAVA_DAT_DIR
filter='Java Daten (*.jdf)')
...
def main():
app = QtGui.QApplication(sys.argv)
print(__file__) # Liefert Python-Filename mit vollständigem Pfad
ex = MainWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Aber wie komme ich in MainWindow() da dran ? Parameter ?
Code: Alles auswählen
...
ex = MainWindow(file_path)
...
- diesch
- User
- Beiträge: 80
- Registriert: Dienstag 14. April 2009, 13:36
- Wohnort: Brandenburg a.d. Havel
- Kontaktdaten:
mephisto-online hat geschrieben: Liefert Filenamen mit Pfad. Muss ich den jetzt "splitten", den Python-Filenamen entfernen und dann meinen Java-Daten-Verzeichnisnamen anfügen ? Oder geht das auch " eleganter ? (Eigentlich ist Python ja schon "elegant" genug ! )
Code: Alles auswählen
os.path.abspath(os.path.join(os.path.dirname(__file__), JAVA_DAT_DIR))
http://www.florian-diesch.de
-
- User
- Beiträge: 167
- Registriert: Sonntag 29. September 2013, 17:05
Das sieht viel "eleganter" aus !
Mein Vorschlag ist da mehr "gebastelt"
Thanks !!
Mein Vorschlag ist da mehr "gebastelt"
Thanks !!