Как найти каталог скрипта с помощью 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.

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


этот код:

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)

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

это работает для меня (и я нашел его через этот вопрос 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__))


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


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

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