Jak mogę znaleźć katalog skryptu w Pythonie? [duplikat]

to pytanie ma już odpowiedzi tutaj : jak poprawnie określić bieżący katalog skryptów w Pythonie? (13 Odpowiedzi) Zamknięty 4 lata temu.

Rozważ następujący kod Pythona:

import os
print os.getcwd()

Używam os.getcwd() aby uzyskać lokalizację katalogu pliku skryptu. Kiedy uruchamiam skrypt z linii poleceń, wyświetla mi on poprawną ścieżkę, podczas gdy gdy uruchamiam go ze skryptu uruchamianego kodem w widoku Django, wyświetla /.

Jak mogę uzyskać ścieżkę do skryptu ze skryptu uruchomionego przez Django widok?

UPDATE:
Podsumowując dotychczasowe odpowiedzi - os.getcwd() i os.path.abspath() dają bieżący katalog roboczy, który może być lub nie być katalogiem, w którym znajduje się skrypt. W mojej konfiguracji hosta internetowego__file__ podaje tylko nazwę pliku bez ścieżki.

Czy w Pythonie nie ma możliwości (zawsze) otrzymania ścieżki, w której znajduje się skrypt?

Author: Martin Thoma, 2011-02-08

12 answers

Musisz wywołać os.path.realpath na __file__, Aby gdy __file__ jest nazwą pliku bez ścieżki, nadal otrzymujesz ścieżkę katalogu:

import os
print(os.path.dirname(os.path.realpath(__file__)))
 860
Author: Czarek Tomczak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-12 08:07:54

Spróbuj sys.path[0].

Cytuję z Python docs:

Po uruchomieniu programu, pierwszym elementem tej listy, path[0], jest katalog zawierający skrypt, który został użyty do wywołania interpretera Pythona. Jeśli katalog skryptu nie jest dostępny (np. jeśli interpreter jest wywoływany interaktywnie lub jeśli skrypt jest odczytywany ze standardowego wejścia), path[0] jest pustym ciągiem znaków, który kieruje Pythona do modułów wyszukiwania w bieżącym katalogu. Zauważ, że skrypt katalog jest wstawiany przed wpisami wstawionymi w wyniku PYTHONPATH.

Źródło: https://docs.python.org/library/sys.html#sys.path

 178
Author: RED MONKEY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-09 22:39:42

Używam:

import os
import sys

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

Jak wskazuje aiham w komentarzu, możesz zdefiniować tę funkcję w module i używać jej w różnych skryptach.

 146
Author: neuro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-09 22:38:29

Ten kod:

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

Ustawia "dn" na nazwę katalogu zawierającego aktualnie wykonywany skrypt. Ten kod:

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

Ustawia "fn" na " script_dir / vcb.init " (w sposób niezależny od platformy) i otwiera ten plik do odczytu przez aktualnie wykonujący skrypt.

Zauważ, że "aktualnie wykonywany skrypt" jest nieco niejednoznaczny. Jeśli cały program składa się z 1 skryptu, to jest to aktualnie wykonujący skrypt i "sys.ścieżka[0]" rozwiązanie działa dobrze. Ale jeśli Twoja aplikacja składa się ze skryptu a, który importuje jakiś pakiet "P", a następnie wywołuje skrypt "B", a następnie" P. B " jest obecnie wykonywany. Jeśli chcesz uzyskać katalog zawierający "P. B", potrzebujesz rozwiązania " os.path.realpath(__file__)".

"__file__" po prostu podaje nazwę aktualnie wykonującego się (z góry stosu) skryptu: "x.py". Nie podaj informacje o ścieżce. To " os./ align = "left" / realpath " call that does the real work.

 20
Author: Al Cramer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-27 01:59:25
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
 15
Author: jbcurtin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 10:35:53

To działało dla mnie (i znalazłem to poprzez to pytanie stoskoverflow )

os.path.realpath(__file__)
 8
Author: Dan R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
 7
Author: beoliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 22:42:03

Użyj os.path.abspath('')

 6
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-08 16:06:46

Oto, z czym skończyłem. Działa to dla mnie, jeśli zaimportuję mój skrypt do interpretera, a także jeśli wykonam go jako skrypt:

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
Author: mpontillo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 17:57:50

Jest to dość stary wątek, ale mam ten problem podczas próby zapisania plików do bieżącego katalogu, w którym znajduje się skrypt podczas uruchamiania skryptu Pythona z Zadania cron. getcwd () i wiele innych ścieżek pochodzi z twojego katalogu domowego.

Aby uzyskać bezwzględną ścieżkę do skryptu, którego użyłem

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

 3
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-19 12:17:35
import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]
 0
Author: Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 16:47:42

Spróbuj tego:

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
Author: Davious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-20 15:10:05