Wie kann ich das Skriptverzeichnis mit Python finden?

Betrachten Sie den folgenden Python-Code:

import os print os.getcwd() 

Ich verwende os.getcwd() , um den Verzeichnispfad der Skriptdatei os.getcwd() . Wenn ich das Skript über die Befehlszeile ausführe, gibt es mir den richtigen Pfad. Wenn ich es über ein Skript ausführe, das in einer Django-Ansicht von Code ausgeführt wird, druckt es / .

Wie kann ich den Pfad zum Skript innerhalb eines von einer Django-Ansicht ausgeführten Skripts abrufen?

AKTUALISIEREN:
Die os.getcwd() Antworten zusammenzufassen – os.getcwd() und os.path.abspath() geben beide das aktuelle Arbeitsverzeichnis an, das das Verzeichnis sein kann, in dem sich das Skript befindet. In meinem Web-Host-Setup gibt __file__ nur den Dateinamen ohne den Pfad an.

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

   

Sie müssen os.path.realpath auf __file__ , so dass, wenn __file__ ein Dateiname ohne den Pfad ist, Sie immer noch den Verzeichnispfad erhalten:

 import os print(os.path.dirname(os.path.realpath(__file__))) 

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 ausführt, können Sie diese function in einem Modul definieren und in verschiedenen Skripten verwenden.

Versuchen Sie sys.path[0] .

Um aus den Python-Dokumenten zu zitieren:

Wie beim Start des Programms initialisiert, ist das erste Element dieser Liste, path[0] , das Verzeichnis, das das Skript enthält, das zum Aufrufen des Python-Interpreters verwendet 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, zunächst Module im aktuellen Verzeichnis zu suchen. Beachten Sie, dass das Skriptverzeichnis vor den Einträgen eingefügt wird, die als Ergebnis von PYTHONPATH eingefügt PYTHONPATH .

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

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 einem Skript besteht, ist dies das aktuell 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 das Skript “B” aufruft, wird gerade “PB” ausgeführt. Wenn Sie das Verzeichnis mit “PB” 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 Pfadinfo. Es ist der Aufruf “os.path.realpath”, der die eigentliche Arbeit leistet.

 import os,sys # Store current working directory pwd = os.path.dirname(__file__) # Append current directory to the python path sys.path.append(pwd) 
 import os script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep 

Dies funktionierte für mich (und ich fand es über die stackoverflow-Frage )

 os.path.realpath(__file__) 

Hier ist, womit ich endete. Das 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) 

Dies ist ein ziemlich alter Thread, aber ich hatte dieses Problem, wenn ich versuche, Dateien in das aktuelle Verzeichnis zu speichern, in dem sich das Skript befindet, wenn ein Python-Skript von einem Cron-Job ausgeführt wird. getcwd () und viele andere Pfade finden Sie in Ihrem Home-Verzeichnis.

um einen absoluten Pfad zum verwendeten Skript zu erhalten

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

Verwende os.path.abspath('')

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) 
 import os exec_filepath = os.path.realpath(__file__) exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]