Как я могу найти каталог скрипта на Python? [дубликат]



этот вопрос уже есть ответ здесь:



рассмотрим следующий код:



import os
print os.getcwd()


Я использую os.getcwd() to получить расположение каталога файла сценария. Когда я запускаю скрипт из командной строки это дает мне правильный путь, тогда как когда я запускаю его из скрипта, выполняемого кодом в представлении Django, он печатает /.



как я могу получить путь к скрипту из сценария, выполняемого представлением Django?



обновление:

Подводя итоги ответов до сих пор -os.getcwd() и os.path.abspath() оба дают текущий рабочий каталог, который может быть или не быть каталогом, в котором находится скрипт. В моей настройке веб-узла __file__ дает только имя файла без путь.



разве в Python нет способа (всегда) получить путь, в котором находится скрипт?

572   12  

12 ответов:

нужно позвонить os.path.realpath on __file__, Так что когда __file__ - это имя файла без пути, который вы все еще получаете путь dir:

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

Я использую:

import os
import sys

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

Как указывает aiham в комментарии, Вы можете определить эту функцию в модуле и использовать ее в разных сценариях.

попробовать sys.path[0].

цитата из документов Python:

как инициализируется при запуске программы, Первый пункт этого списка,path[0], это каталог, содержащий сценарий, который был использован для вызова интерпретатора Python. Если каталог скриптов недоступен (например, если интерпретатор вызывается интерактивно или если скрипт считывается со стандартного ввода),path[0] - пустая строка, которая направляет Python на поиск модулей в текущем каталоге первый. Обратите внимание, что каталог скриптов вставляется перед записями, вставленными в результате PYTHONPATH.

источник:https://docs.python.org/library/sys.html#sys.path

этот код:

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

устанавливает " dn " в имя каталога, содержащего текущий выполняемый скрипт. Этот код:

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

устанавливает "fn "в" script_dir/vcb.init " (в независимой от платформы манере) и открывается этот файл для чтения текущим скриптом.

обратите внимание, что "текущий выполняемый скрипт" несколько неоднозначен. Если вся ваша программа состоит из 1 скрипта, то это текущий скрипт и "sys.путь[0]" решение работает отлично. Но если ваше приложение состоит из скрипта A, который импортирует некоторый пакет "P", а затем вызывает скрипт "B", то "P. B" в настоящее время выполняется. Если вам нужно получить каталог, содержащий "P. B", вы хотите "os.path.realpath(__file__)" решение.

"__file__ " просто дает имя текущего выполняемого (top-of-stack) скрипта: "x.py". это не так дайте любую информацию о пути. Это "ОС".путь.realpath " вызов, который делает реальную работу.

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

это работает для меня (и я нашел его через этот вопрос stackoverflow)

os.path.realpath(__file__)

вот что у меня получилось. Это работает для меня, если я импортирую свой скрипт в интерпретатор, а также если я выполняю его как скрипт:

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)

Это довольно старый поток, но у меня была эта проблема при попытке сохранить файлы в текущий каталог, в котором находится скрипт при запуске скрипта python из задания cron. getcwd () и многие другие пути придумывают ваш домашний каталог.

чтобы получить абсолютный путь к скрипту я использовал

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

использовать os.path.abspath('')

попробуйте это:

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__))]

Comments

    Ничего не найдено.