SheBang-Problem

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.
Antworten
Charlie_Firpo
User
Beiträge: 4
Registriert: Dienstag 26. August 2014, 20:16

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!
Benutzeravatar
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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
__file__ enthält den kompletten Pfad zum Programm und daraus lässt sich problemlos mit Bordmitteln der Pfad extrahieren.

Code: Alles auswählen

import os
print(os.path.dirname(__file__))
Einen Pfad würde man kanonisch auch nicht mit "./"+dateiname zusammenbasteln, sondern systemunabhängig mit os.path.join arbeiten.

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.
Charlie_Firpo
User
Beiträge: 4
Registriert: Dienstag 26. August 2014, 20:16

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.
Vielen Dank schonmal für die Erläuterung. Wie komme ich denn aber nun an das Verzeichnis, aus dem das Programm gestartet wurde?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Charlie_Firpo hat geschrieben:Wie komme ich denn aber nun an das Verzeichnis, aus dem das Programm gestartet wurde?
In dem Verzeichnis befindest du dich ja gerade. Du suchst stattdessen das Verzeichnis in dem das Programm liegt.
Charlie_Firpo
User
Beiträge: 4
Registriert: Dienstag 26. August 2014, 20:16

/me hat geschrieben:
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.
__file__ enthält den kompletten Pfad zum Programm und daraus lässt sich problemlos mit Bordmitteln der Pfad extrahieren.

Code: Alles auswählen

import os
print(os.path.dirname(__file__))
Einen Pfad würde man kanonisch auch nicht mit "./"+dateiname zusammenbasteln, sondern systemunabhängig mit os.path.join arbeiten.

Code: Alles auswählen

full_path = os.path.join('./', dateiname)
os.path.dirname(__file__) liefert für mich nur "." und bei nem Punkt war ich ja auch schon.

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")
BlackJack

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')
Charlie_Firpo
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.
BlackJack

@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.
Antworten