2013-10-28 9 views
10

Ich habe ein ausführbares Python-Skript, das in einem "scripts" -Verzeichnis vorhanden ist, und es gibt eine symbolische Verknüpfung zu diesem Skript (zum Starten der Datei) in einem Stammverzeichnis. Etwas wie:Starten eines Python-Skripts über eine symbolische Verbindung

. 
├── scripts 
│ ├── const.py 
│ ├── fops.py 
│ ├── i_build.py 
│ └── i_Props.ini 
└── build_i -> scripts/i_build.py 

Ich mag wäre in der Lage sein, meine Skripte über starten/ausführen:

python build_i 

Aus dem Stammverzeichnis. Das i_build.py-Skript versucht, i_Props.ini zu öffnen und magisch basierend auf dem, was drin ist.

Wenn das i_build.py-Skript über den Symlink im Stammverzeichnis gestartet wird, sucht das Skript i_build.py im Stammverzeichnis nach den anderen Dateien (nicht nach dem Verzeichnis/scripts, in dem sich i_build.py befindet) gelagert).

Die i_build.py Datei hat die Requisiten Speicherort der Datei als:

PROP_FILE = "i_Props.ini" 

und versucht, das zu öffnen, und schlägt dann fehl. Ich möchte einen Pfad aus offensichtlichen Gründen nicht fest codieren.

Ein schneller Test, der os.getcwd() in der Hauptdatei hinzufügt, bestätigt meinen Verdacht, dass er denkt, dass das CWD das Stammverzeichnis ist, und eine Überprüfung von __file__ sagt, dass es der symbolische Link ("build_i") ist.

Gibt es irgendetwas, was ich tun kann, damit Python das Ziel der symbolischen wie für den __file__ Namen und CWD verwenden?

+0

Sie könnten wahrscheinlich das Dateisystem mit kqueue/was auch immer sie auf den anderen Betriebssystemen haben, überwachen. Die Sache, die letztendlich die beiden Orte voneinander trennt, könnte der Inode sein, der die Ausführung initiiert. Nichts davon ist sehr deutlich, ohne etwas zu graben. Das einzige andere Ding, das ich denken kann, wäre eine harte Verbindung und keine weiche Verbindung, aber ich denke, dass das den gegenteiligen Effekt haben könnte. Es gibt ein paar Shell-Tricks, die Sie tun könnten, ich glaube, Z-Shell hat einen "bevor Sie das Programm ausführen" Hook, der Ihre echte cwd zum Skript als arg füttern könnte .. – synthesizerpatel

+0

Dies ist keine Antwort wert, so dass ich ich kommentiere. Sie könnten den Symlink mit 'os.readlink()' lesen und das Skript vom Ergebnis mit 'subprocess.Popen()' ausführen. Ein bisschen klobig, aber macht den Job, da nichts fest codiert ist und keine Abhängigkeiten hinzufügt. – ThinkChaos

+0

verwandt: [Wie bekomme ich den Pfad der aktuell ausgeführten Datei in Python?] (Http://stackoverflow.com/q/2632199/4279) – jfs

Antwort

1

Nur ein paar Möglichkeiten in den Sinn:

  1. im Stammverzeichnis haben eine Shell-Datei, die Python Skript von expliziten Pfad nennt.
  2. Fügen Sie Ihrem Pfad das Verzeichnis hinzu, in dem es sich befindet.
  3. hinzufügen Insbesondere das Verzeichnis
+0

Option 1 könnte meine Arbeit sein ... 2 und 3 sind im Wesentlichen Hardcoding immer noch.Ich muss alles vermeiden, was zusätzliche Schritte mit sich bringt, da dies an eine Anzahl von Leuten verteilt wird, je weniger Umgebungen, die mit dem Besseren verwechselt werden. – Mike

+0

Unter Linux, wenn Sie das Bash-Skript zu/etc oder/bin oder/usr/etc hinzufügen, wird es ausführbar sein, ohne einen Pfad anzugeben. –

13

Sie __file__ verwenden können, um sys.path, aber Sie müssen einige Vorsichtsmaßnahmen ergreifen, um den wirklichen Weg zu bekommen:

import os 
base_dir = os.path.dirname(os.path.realpath(__file__)) 

Dann relativ andere Dateien/Ressourcen laden zu base_dir:

+1

['__file__' kann undefiniert sein] (http://stackoverflow.com/q/2632199/4279) Sie könnten in diesem Fall auf 'sys.argv [0]' zurückgreifen (https://bitbucket.org/) pypy/pypy/src/a299cd0a893f/pypy/tool/autopath.py? bei = default # cl-29) – jfs

Verwandte Themen