So ändern Sie das Arbeitsverzeichnis für ein Shell-Skript

So ändern Sie das Arbeitsverzeichnis für ein Shell-Skript

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.pylä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 cdzuerst, 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.

  1. 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 Sie os.path.abspath()dort auch einen Aufruf einfügen, wenn sys.argv[0]ein relativer Pfad vorhanden ist, aber probieren Sie ein wenig damit herum, und Sie sollten es zum Laufen bringen können.

  2. Ä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

verwandte Informationen