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?
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
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
verwandt: [Wie bekomme ich den Pfad der aktuell ausgeführten Datei in Python?] (Http://stackoverflow.com/q/2632199/4279) – jfs