Hallo.
Ich habe auf meinem Mac ein kleines Programm erstellt, das den Text aus einer pbm Datei ausliest, um diesen dann zu interpretieren. Funktioniert einwandfrei, wenn ich es im Terminal starte.
Jetzt wollte ich das Programm aber auch zu einer executable machen. Habe also einen Shebang hinzugefügt sowie die Datei mit dem 'chmod'-Befehl im Terminal auch für ausführbar erklärt.
Das Programm startet nun also nach einem Doppelklick im Terminal.
Problem: Wie gewohnt, fragt das Programm mich nach dem Namen der Datei, die ich öffnen möchte. Nach der Eingabe behauptet das Programm aber, eine solche Datei existiere nicht. ( Die zu öffnende Datei befindet sich im selben Ordner wie die Datei )
Herausgefunden habe ich mittlerweile, dass dem Problem Abhilfe geschafft wird, wenn ich den kompletten Pfad des Programms der zu öffnenden Datei voranstelle, ein bloßes "./"+dateiname reicht dagegen nicht aus. Jetzt will ich natürlich nicht, dass das Programm nur auf meinem Computer in einem bestimmten Ordner laufen kann.
Hat jemand ne Idee, wie ich das Problem beheben kann?
Vielen Dank im Voraus! Jede Idee willkommen!
SheBang-Problem
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Willkommen im Forum!
Das Stichwort lautet "Arbeitsverzeichnis" ("working directory").
Wenn du es selbst im Terminal startest, dann befindest du dich wahrscheinlich im Verzeichnis in das Programm liegt und damit ist die relative Pfadeingabe kein Problem.
Wenn du es aber per Doppelklick startest, ist dein Arbeitsverzeichnis aber nicht das, das in dem die Datei liegt.
Das Stichwort lautet "Arbeitsverzeichnis" ("working directory").
Wenn du es selbst im Terminal startest, dann befindest du dich wahrscheinlich im Verzeichnis in das Programm liegt und damit ist die relative Pfadeingabe kein Problem.
Wenn du es aber per Doppelklick startest, ist dein Arbeitsverzeichnis aber nicht das, das in dem die Datei liegt.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
__file__ enthält den kompletten Pfad zum Programm und daraus lässt sich problemlos mit Bordmitteln der Pfad extrahieren.Charlie_Firpo hat geschrieben:Herausgefunden habe ich mittlerweile, dass dem Problem Abhilfe geschafft wird, wenn ich den kompletten Pfad des Programms der zu öffnenden Datei voranstelle, ein bloßes "./"+dateiname reicht dagegen nicht aus.
Code: Alles auswählen
import os
print(os.path.dirname(__file__))
Code: Alles auswählen
full_path = os.path.join('./', dateiname)
Zuletzt geändert von /me am Dienstag 26. August 2014, 20:45, insgesamt 1-mal geändert.
-
- User
- Beiträge: 4
- Registriert: Dienstag 26. August 2014, 20:16
Vielen Dank schonmal für die Erläuterung. Wie komme ich denn aber nun an das Verzeichnis, aus dem das Programm gestartet wurde?cofi hat geschrieben:Willkommen im Forum!
Wenn du es selbst im Terminal startest, dann befindest du dich wahrscheinlich im Verzeichnis in das Programm liegt und damit ist die relative Pfadeingabe kein Problem.
Wenn du es aber per Doppelklick startest, ist dein Arbeitsverzeichnis aber nicht das, das in dem die Datei liegt.
In dem Verzeichnis befindest du dich ja gerade. Du suchst stattdessen das Verzeichnis in dem das Programm liegt.Charlie_Firpo hat geschrieben:Wie komme ich denn aber nun an das Verzeichnis, aus dem das Programm gestartet wurde?
-
- User
- Beiträge: 4
- Registriert: Dienstag 26. August 2014, 20:16
os.path.dirname(__file__) liefert für mich nur "." und bei nem Punkt war ich ja auch schon./me hat geschrieben:__file__ enthält den kompletten Pfad zum Programm und daraus lässt sich problemlos mit Bordmitteln der Pfad extrahieren.Charlie_Firpo hat geschrieben:Herausgefunden habe ich mittlerweile, dass dem Problem Abhilfe geschafft wird, wenn ich den kompletten Pfad des Programms der zu öffnenden Datei voranstelle, ein bloßes "./"+dateiname reicht dagegen nicht aus.Einen Pfad würde man kanonisch auch nicht mit "./"+dateiname zusammenbasteln, sondern systemunabhängig mit os.path.join arbeiten.Code: Alles auswählen
import os print(os.path.dirname(__file__))
Code: Alles auswählen
full_path = os.path.join('./', dateiname)
Ob ich "./"+dateinamen zusammenbastle oder os.path.join benutze führt zum gleichen Ergebnis, auch hier findet er die Datei nicht.
Was muss ich machen, damit es funktioniert?
Schreibt mir bitte folgende Zeilen so um bzw. ergänzt sie so, dass es funzt! ( Ich denke weiterer Kontext is hier nicht nötig )
#!/usr/bin/env python3
datei = input()
data = open (datei,"rb")
Im Grunde hatten wir das jetzt doch schon:
Code: Alles auswählen
#!/usr/bin/env python3
import os
datei_name = input()
datei = open(os.path.join(os.path.dirname(__file__), datei_name), 'rb')
-
- User
- Beiträge: 4
- Registriert: Dienstag 26. August 2014, 20:16
Alles klar. Funzt auch alles.
Was mich nur interessieren würde, ist wieso
print (os.path.dirname(__file__))
mir nen '.' ausgibt, ich aber den Pfad nicht gleich mit einem Punkt beschreiben kann.
Danke.
Was mich nur interessieren würde, ist wieso
print (os.path.dirname(__file__))
mir nen '.' ausgibt, ich aber den Pfad nicht gleich mit einem Punkt beschreiben kann.
Danke.
@Charlie_Firpo: Wenn das einen '.' ausgibt, dann kannst Du auch gleich einen '.' schreiben. Allerdings muss das ja nicht immer der Punkt sein. Denn wenn es das wäre, dann könntest Du auch nur den Dateinamen ohne irgendetwas davor nehmen, denn im aktuellen Verzeichnis wird ja normalerweise gesucht. Das ist nur der '.' wenn das Arbeitsverzeichnis das Verzeichnis mit dem Skript ist.