Как найти каталог script с Python?

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

import os
print os.getcwd()

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

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

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

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

Ответ 1

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

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

Ответ 2

Я использую:

import os
import sys

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

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

Ответ 3

Попробуйте sys.path[0].

Для цитирования из документов Python:

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

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

Ответ 4

Этот код:

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

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

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

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

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

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

Ответ 5

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

Ответ 7

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

Ответ 8

Используйте os.path.abspath('')

Ответ 9

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

чтобы получить абсолютный путь к используемому script i

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

Ответ 10

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

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)

Ответ 11

Попробуйте следующее:

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)

Ответ 12

import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]