Ich habe ein Python-Skript, das Dateien in einem relativen Verzeichnis sucht. Beispiel: Das Python-Skript befindet sich in /home/username/projectname/
. Ich habe eine Datei, die innerhalb des Python-Skripts aufgerufen wird und sich in befindet /home/username/projectname/subfolder
.
Wenn ich das Skript von der Shell aus ausführe, python scriptname.py
läuft es einwandfrei.
Ich versuche jedoch, das Skript als Startdienst auszuführen. Ich richte es in Webmin ein und glaube, es erstellt ein Shell-Skript, um es aufzurufen. Über das Startskript mache ich so etwas, um das Skript aufzurufen:
execute python home/username/projectname/scriptname.py
Das Skript wird ordnungsgemäß gestartet, kann jedoch nicht auf die Dateien im relativen Verzeichnis zugreifen.
Ich vermute, dass es eine bessere Möglichkeit gibt, das Python-Programm innerhalb des Startskripts aufzurufen, damit es den relativen Pfad kennt.
Antwort1
Schnell und dreckig:
Verwenden Sie in Ihrem Startskript cd
zuerst, anstatt einfach das Python-Skript auszuführen.
#!/bin/sh
cd /home/username/projectname &&
python ./scriptname.py
Antwort2
Es gibt einige Möglichkeiten, dies direkt in Ihrem Python-Skript zu umgehen.
Wenn sich Ihr Skript immer im Ordner „/home/Benutzername/Projektname/Unterordner“ befindet, können Sie dies einfach zu Ihrem Suchpfad in Python hinzufügen:
import sys sys.path.append("/home/username/projectname/subfolder")
Ich vermute jedoch, dass Sie dies möglicherweise in mehreren „Projektname“-Verzeichnissen haben, daher sieht eine allgemeinere Lösung etwa so aus:
import sys import os sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
Dadurch wird das Verzeichnis gefunden, in dem sich das Python-Skript befindet
sys.argv[0]
, der Verzeichnisteil wird extrahiert, „Unterordner“ wird daran angehängt und der Teil wird in den Suchpfad eingefügt.Beachten Sie, dass einige Betriebssysteme den Namen der ausführbaren Datei nur in angeben
sys.argv[0]
. Ich habe keine gute Lösung für diesen Fall, vielleicht hat jemand anderes eine. Möglicherweise müssen Sieos.path.abspath()
dort auch einen Aufruf einfügen, wennsys.argv[0]
ein relativer Pfad vorhanden ist, aber probieren Sie ein wenig damit herum, und Sie sollten es zum Laufen bringen können.Ähnlich wie bei der obigen Antwort können Sie das Python-Skript selbstständig Verzeichnisse wechseln lassen, ohne dass ein Wrapper-Skript erforderlich ist:
import os os.chdir("/home/username/projectname")
Antwort3
Eine noch schnellere und einfachere Möglichkeit, dies zu tun (mit einer Subshell):
( cd my/path/to/folder && python myprogram.py )
Antwort4
set PYTHONPATH=PROJECTPATH && python script.py