Seite 1 von 1

Shell-Skripte ausführen, als würden sie manuell gestartet

Verfasst: Mittwoch 5. März 2008, 11:14
von Tekl
Hi,

Wenn ich ein Shell-Skript aus Python aufrufen, bekomme ich folgende Fehlermeldung:
seek() on closed filehandle ARGV at /Developer/Extras/Dictionary Development Kit/bin/make_line.pl line 55, <> chunk 44318.
Ich verwende dabei den Befehl subprocess.call(), aber auch mit den anderen Varianten wie os.popen (Zusätzlich mit Broken-pipe-Fehlern) oder os.system klappt es nicht.

Ich arbeite unter OS X 10.5.2

Tekl

Verfasst: Mittwoch 5. März 2008, 12:19
von Tekl
Evtl. ist wichtig zu erwähnen, dass ich das Skript mit Befehl+R direkt aus Textmate starte. Wenn ich das Skript per Doppelklick starte ist das Arbeitsverzeichnis mein Benutzerordner und nicht das Verzeichnis wo das Skript liegt.

Wie komme ich denn daran?

Verfasst: Mittwoch 5. März 2008, 12:25
von Tekl
Ich habe mir die letzte Frage bereits selber beantworten können.

Mit

Code: Alles auswählen

os.chdir( os.sep.join(sys.argv[0].split(os.sep)[:-1]) )
wird auch beim Doppelklick ein Skript in dem Verzeichnis ausgeführt, wo es liegt. Vermutlich gibt's aber auch eine einfachere Lösung, denn besonders elegant, lesbar und vor allem merkbar ist das nicht gerade.

Ich dachte, wenn ich das Skript per Doppelklick starte, kommt keine Fehlermeldung. Leider doch.

Meine ursprüngliche Frage ist also noch nicht geklärt.

Verfasst: Mittwoch 5. März 2008, 12:44
von jens
Wie wäre es damit:

Code: Alles auswählen

os.path.split(os.path.abspath(sys.argv[0]))[0]

Verfasst: Mittwoch 5. März 2008, 13:03
von Tekl
Naja, nicht viel besser. Gibt's dafür keine Befehle wie in PHP?

Verfasst: Mittwoch 5. März 2008, 13:56
von HWK
jens hat geschrieben:Wie wäre es damit:

Code: Alles auswählen

os.path.split(os.path.abspath(sys.argv[0]))[0]
entspricht

Code: Alles auswählen

os.path.dirname(os.path.abspath(sys.argv[0]))
MfG
HWK

Verfasst: Mittwoch 5. März 2008, 13:58
von jens
Ahja, stimmt... Im os.path modul sind doch immer wieder einige nette Dinge zu finden ;)

Verfasst: Mittwoch 5. März 2008, 18:06
von BlackJack
An den Dateinamen eines Moduls kommt man auch über das `__file__`-Attribut des Moduls heran.