Как найти каталог скрипта с помощью Python? [дубликат]
этот вопрос уже есть ответ здесь:
- Как правильно определить текущий каталог скрипта? 13 ответов
рассмотрим следующий код:
import os
print os.getcwd()
Я использую os.getcwd()
to получить расположение каталога файла сценария. Когда я запускаю скрипт из командной строки это дает мне правильный путь, тогда как когда я запускаю его из скрипта, запускаемого кодом в представлении Django, он печатает /
.
как я могу получить путь к скрипту из сценария, запущенного видом Django?
обновление:
Подводя итоги ответов до сих пор -os.getcwd()
и os.path.abspath()
оба дают текущий рабочий каталог, который может быть или не быть каталогом, где находится скрипт. В моей настройке веб-узла
дает только имя файла без путь.__file__
разве в Python нет способа (всегда) получить путь, в котором находится скрипт?
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
.
этот код:
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)
это работает для меня (и я нашел его через этот вопрос 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__))
попробуйте это:
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__))]