it-swarm.com.de

Wie finde ich das Skriptverzeichnis mit Python?

Betrachten Sie den folgenden Python Code:

import os
print os.getcwd()

Ich benutze os.getcwd(), um den Verzeichnisverzeichnis der Skriptdatei abzurufen . Wenn ich das Skript über die Befehlszeile ausführe, erhalte ich den richtigen Pfad. Wenn ich es über ein Skript ausführe, das mit Code in einer Django - Ansicht ausgeführt wird, wird es gedruckt /.

Wie kann ich den Pfad zum Skript aus einem Skript heraus abrufen, das von einer Django - Ansicht) ausgeführt wird?

UPDATE:
Zusammenfassung der bisherigen Antworten - os.getcwd() und os.path.abspath() geben beide das aktuelle Arbeitsverzeichnis an, das möglicherweise das Verzeichnis ist, in dem sich das Skript befindet oder nicht. In meinem Webhost-Setup gibt __file__ Nur den Dateinamen ohne Pfad an.

Gibt es in Python) keine Möglichkeit, (immer) den Pfad zu empfangen, in dem sich das Skript befindet?

477
Jonathan

Sie müssen os.path.realpath auf __file__ aufrufen, damit Sie, wenn __file__ ein Dateiname ohne den Pfad ist, immer noch den Pfad dir erhalten:

import os
print(os.path.dirname(os.path.realpath(__file__)))
674
Czarek Tomczak

Versuchen Sie sys.path[0].

So zitieren Sie aus den Python -Dokumenten:

Wie beim Programmstart initialisiert, ist das erste Element dieser Liste, path[0], das Verzeichnis, das das Skript enthält, mit dem der Interpreter Python aufgerufen wurde. Wenn das Skriptverzeichnis nicht verfügbar ist (z. B. wenn der Interpreter interaktiv aufgerufen wird oder wenn das Skript von der Standardeingabe gelesen wird), ist path[0] die leere Zeichenfolge, die Python anweist, nach Modulen in der zu suchen aktuelles Verzeichnis zuerst. Beachten Sie, dass das Skriptverzeichnis vor den Einträgen eingefügt wird, die als Ergebnis von PYTHONPATH eingefügt wurden.

Quelle: https://docs.python.org/library/sys.html#sys.path

155
RED MONKEY

Ich benutze:

import os
import sys

def get_script_path():
    return os.path.dirname(os.path.realpath(sys.argv[0]))

Wie aiham in einem Kommentar betont, können Sie diese Funktion in einem Modul definieren und in verschiedenen Skripten verwenden.

127
neuro

Dieser Code:

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

setzt "dn" auf den Namen des Verzeichnisses, das das aktuell ausgeführte Skript enthält. Dieser Code:

fn = os.path.join(dn,"vcb.init")
fp = open(fn,"r")

setzt "fn" auf "script_dir/vcb.init" (plattformunabhängig) und öffnet diese Datei zum Lesen durch das aktuell ausgeführte Skript.

Beachten Sie, dass "das aktuell ausgeführte Skript" etwas mehrdeutig ist. Wenn Ihr gesamtes Programm aus 1 Skript besteht, ist dies das derzeit ausgeführte Skript, und die Lösung "sys.path [0]" funktioniert einwandfrei. Wenn Ihre App jedoch aus Skript A besteht, das ein Paket "P" importiert und dann Skript "B" aufruft, wird "P.B" derzeit ausgeführt. Wenn Sie das Verzeichnis mit "P.B" benötigen, möchten Sie die Lösung "os.path.realpath(__file__)".

"__file__" gibt nur den Namen des aktuell ausgeführten (Top-of-Stack-) Skripts an: "x.py". Es gibt keine Pfadinformationen. Der Aufruf "os.path.realpath" erledigt die eigentliche Arbeit.

17
Al Cramer
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
15
jbcurtin
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
7
beoliver

Das hat bei mir funktioniert (und ich habe es über die this stackoverflow-Frage gefunden)

os.path.realpath(__file__)
7
Dan R

Hier ist, womit ich gelandet bin. Dies funktioniert für mich, wenn ich mein Skript in den Interpreter importiere und es auch als Skript ausführe:

import os
import sys

# Returns the directory the current script (or interpreter) is running in
def get_script_directory():
    path = os.path.realpath(sys.argv[0])
    if os.path.isdir(path):
        return path
    else:
        return os.path.dirname(path)
4
mpontillo

Dies ist ein ziemlich alter Thread, aber ich habe dieses Problem beim Versuch, Dateien in dem aktuellen Verzeichnis zu speichern, in dem sich das Skript befindet, wenn ein python -Skript von einem Cron-Job ausgeführt wird. getcwd () und ein Großteil des anderen Pfads finden Sie in Ihrem Home-Verzeichnis.

um einen absoluten Pfad zu dem Skript zu erhalten, das ich verwendet habe

directory = os.path.abspath(os.path.dirname(__file__))

3
James

Benutze os.path.abspath('')

3
Jonathan

Versuche dies:

def get_script_path(for_file = None):
    path = os.path.dirname(os.path.realpath(sys.argv[0] or 'something'))
    return path if not for_file else os.path.join(path, for_file)
0
Davious