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