Как мне найти каталог скрипта с 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)
Это сработало для меня (и я нашел это с помощью этого вопроса 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__))]