Как мне найти каталог скрипта с Python?

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

import os
print os.getcwd()

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

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

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

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

12 ответов

Решение

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

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

Пытаться sys.path[0],

Цитировать из документов Python:

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

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

Я использую:

import os
import sys

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

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

Этот код:

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.path[0]" работает нормально. Но если ваше приложение состоит из сценария A, который импортирует некоторый пакет "P", а затем вызывает сценарий "B", то в настоящий момент выполняется "PB". Если вам нужно получить каталог, содержащий "PB", вы хотите "os.path.realpath(__file__)" решение.

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

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

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

Это сработало для меня (и я нашел это с помощью этого вопроса stackru)

os.path.realpath(__file__)
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep

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

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

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

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__))]
Другие вопросы по тегам