python текущая директория скрипта
Получить каталог текущего скрипта Python
При работе с обработкой файлов вы могли заметить, что на файлы ссылаются только их имена, например, « GFG.txt », и если файл не находится в каталоге скрипта, Python вызывает ошибку. Итак, как это сделать?
Концепция текущего рабочего каталога (CWD) становится здесь важной. Рассмотрим CWD как папку, внутри которой работает Python. Всякий раз, когда файлы вызываются только по их имени, Python предполагает, что он запускается в CWD, что означает, что ссылка только на имя будет успешной, только если файл находится в CWD Python.
Примечание. Папка, в которой выполняется скрипт Python, называется Current Directory. Это не путь, где находится скрипт Python.
Получение текущего рабочего каталога
Python предоставляет модуль ОС для взаимодействия с операционной системой. Этот модуль входит в стандартную утилиту Python. Все функции в модуле os вызывают OSError в случае недопустимых или недоступных имен и путей к файлам или других аргументов, которые имеют правильный тип, но не принимаются операционной системой.
Parameter: No parameter is required.
Return Value: This method returns a string which represents the current working directory.
Пример:
# Python программа для объяснения метода os.getcwd ()
# Получить текущую работу
# каталог (CWD)
# Распечатать текущую работу
# каталог (CWD)
print ( «Current working directory:» )
Выход:
Примечание. Чтобы узнать больше о os.getcwd() нажмите здесь.
Получение пути сценария
os.path.realpath() можно использовать для получения пути к текущему скрипту Pyhton. На самом деле os.path.realpath() в Python используется для получения канонического пути указанного имени файла путем устранения любых символических ссылок, встречающихся в пути. Специальная переменная __file__ передается realpath() для получения пути к скрипту Python.
Примечание: __file__ — это путь к файлу, из которого был загружен модуль, если он был загружен из файла.
Syntax: os.path.realpath(path)
Parameter:
path: A path-like object representing the file system path.
A path-like object is either a string or bytes object representing a path.
Return Type: This method returns a string value which represents the canonical path.
Exmaple:
# Python программа для получения
# путь скрипта
# Получить текущую работу
# каталог (CWD)
Работа с файлами в Python с помощью модуля OS
Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.
В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.
Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.
Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.
Вывод текущей директории
Для получения текущего рабочего каталога используется os.getcwd() :
os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:
Создание папки
Для создания папки/каталога в любой операционной системе нужна следующая команда:
После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».
Изменение директории
Менять директории довольно просто. Проделаем это с только что созданным:
Еще раз выведем рабочий каталог:
Создание вложенных папок
Предположим, вы хотите создать не только одну папку, но и несколько вложенных:
Это создаст три папки рекурсивно, как показано на следующем изображении:
Создание файлов
w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.
Переименование файлов
С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.
Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.
Перемещение файлов
Функцию os.replace() можно использовать для перемещения файлов или каталогов:
Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем ( renamed-text.txt ), он будет перезаписан.
Список файлов и директорий
Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:
А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk() :
os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:
Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.
Удаление файлов
Удалим созданный файл:
os.remove() удалит файл с указанным именем (не каталог).
Удаление директорий
С помощью функции os.rmdir() можно удалить указанную папку:
Для удаления каталогов рекурсивно необходимо использовать os.removedirs() :
Это удалит только пустые каталоги.
Получение информации о файлах
Это вернет кортеж с отдельными метриками. В их числе есть следующие:
Для получения конкретного атрибута нужно писать следующим образом:
Как получить и изменить текущий рабочий каталог в Python
При работе с файлами в каталогах в Python всегда рекомендуется использовать абсолютные пути. Однако, если вы работаете с относительными путями, вам необходимо понимать концепцию текущего рабочего каталога и то, как найти или изменить текущий рабочий каталог. Абсолютный путь указывает расположение файла или каталога, начиная с корневого каталога, а относительный путь начинается с текущего рабочего каталога.
Когда вы запускаете сценарий Python, в качестве текущего рабочего каталога устанавливается каталог, из которого выполняется сценарий.
Модуль os python обеспечивает переносимый способ взаимодействия с операционной системой. Модуль является частью стандартной библиотеки Python и включает методы поиска и изменения текущего рабочего каталога.
Получение текущего рабочего каталога в Python
Метод getcwd() модуля os в Python возвращает строку, содержащую абсолютный путь к текущему рабочему каталогу. Возвращенная строка не включает завершающий символ косой черты.
Чтобы использовать методы модуля os, вы должны импортировать модуль в верхней части файла.
Ниже приведен пример, показывающий, как распечатать текущий рабочий каталог:
Результат будет выглядеть примерно так:
Изменение текущего рабочего каталога в Python
Метод принимает один аргумент — путь к каталогу, в который вы хотите перейти. Аргумент path может быть абсолютным или относительным.
Результат будет выглядеть примерно так:
Выводы
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Как правильно определить текущий каталог script?
Я хотел бы посмотреть, как лучше определить текущий каталог скриптов в Python?
Я обнаружил, что из-за множества способов вызова кода на Python трудно найти хорошее решение.
Вот некоторые проблемы:
Я знаю, что не существует идеального решения, но я ищу лучший подход, который решает большинство случаев.
Предупреждение
Любое решение, использующее текущую директорию, потерпит неудачу, это может отличаться в зависимости от того, как вызывается скрипт, или его можно изменить внутри запущенного скрипта.
ОТВЕТЫ
Ответ 1
действительно лучшее, что вы собираетесь получить.
Нет другого способа получить имя файла в исполняемом коде: как вы заметили, CWD может находиться в совершенно другом месте.
Ответ 2
Ответ 3
Ответ 4
В Python 3. 4+ вы можете использовать более pathlib модуль pathlib :
Ответ 5
Ответ 6
Вначале.. пара пропустит прецеденты здесь, если мы говорим о способах ввода анонимного кода.
Этот модуль содержит класс RExec, который поддерживает r_eval(), r_execfile(), r_exec() и r_import(), которые являются ограниченными версиями стандарта Функции Python: eval(), execfile() и операторы exec и import. Код выполненный в этой ограниченной среде будет иметь доступ только к модулям и функции, которые считаются безопасными; ты можешь Подкласс RExec добавляет или удаляет возможности как желательно.
Однако, если это скорее академическое преследование.. вот пара дурацких подходов, которые вы может быть в состоянии копать немного глубже в..
./deep.py
./deeper.py
/tmp/deepest.py
./codespy.py
Выход
Конечно, это ресурсоемкий способ сделать это, вы будете отслеживать весь ваш код. Не очень эффективен. Но, я думаю, это новый подход так как он продолжает работать, даже когда вы углубляетесь в гнездо. Вы не можете переопределить «eval». Хотя вы можете переопределить execfile().
Обратите внимание, что этот подход охватывает только exec/execfile, а не «import». Для подключения нагрузки модуля «более высокий уровень» вы можете использовать использование sys.path_hooks (Запись из PyMOTW).
Это все, что у меня на голове.
Ответ 7
Это должно работать в большинстве случаев:
Ответ 8
os.path. была «сделанная вещь» в Python 2.
В Python 3 вы можете найти каталог сценариев следующим образом:
Ответ 9
Вот частичное решение, все еще лучше, чем все опубликованные до сих пор.
Теперь все будет работать, но если кто-то использует chdir() для изменения текущего каталога, это также не сработает.
Ответ 10
Ответ 11
делай, что хочешь? Я не уверен, что именно вы подразумеваете под «текущим каталогом script». Каким будет ожидаемый результат для используемых вами случаев использования?
Ответ 12
Это решение должно дать вам то, что вы ищете во всех случаях:
Я не проверил его полностью, но решил мою проблему.
Ответ 13
только pwd
на ноутбуке jupyter: pwd + shift + enter
на spyder: pwd + F9
How do you properly determine the current script directory?
I would like to see what is the best way to determine the current script directory in Python.
I discovered that, due to the many ways of calling Python code, it is hard to find a good solution.
Here are some problems:
I know that there is no perfect solution, but I’m looking for the best approach that solves most of the cases.
Warning
Any solution that uses current directory will fail, this can be different based on the way the script is called or it can be changed inside the running script.
15 Answers 15
is indeed the best you’re going to get.
It’s unusual to be executing a script with exec / execfile ; normally you should be using the module infrastructure to load scripts. If you must use these methods, I suggest setting __file__ in the globals you pass to the script so it can read that filename.
There’s no other way to get the filename in execed code: as you note, the CWD may be in a completely different place.
«) is a cross-platform way to get the user’s directory. Unfortunately, that isn’t the Windows best practice for where to stick application data.
In Python 3.4+ you can use the simpler pathlib module:
You can also use __file__ to avoid the inspect module altogether:
The os.path. approach was the ‘done thing’ in Python 2.
In Python 3, you can find directory of script as follows:
Just use os.path.dirname(os.path.abspath(__file__)) and examine very carefully whether there is a real need for the case where exec is used. It could be a sign of troubled design if you are not able to use your script as a module.
do what you want? I’m not sure what exactly you mean by the «current script directory». What would the expected output be for the use cases you gave?
Note: this answer is now a package
I frequently use the directory of my scripts (for accessing files stored along side them), but I also frequently run these scripts in an interactive shell for debugging purposes. I define __dirpath__ as:
Python 3.4 (and above):
Python 2 (and above):
Explanation:
First.. a couple missing use-cases here if we’re talking about ways to inject anonymous code..
This module contains the RExec class, which supports r_eval(), r_execfile(), r_exec(), and r_import() methods, which are restricted versions of the standard Python functions eval(), execfile() and the exec and import statements. Code executed in this restricted environment will only have access to modules and functions that are deemed safe; you can subclass RExec add or remove capabilities as desired.
However, if this is more of an academic pursuit.. here are a couple goofy approaches that you might be able to dig a little deeper into..
./deep.py
./deeper.py
/tmp/deepest.py
./codespy.py
Output
Of course, this is a resource-intensive way to do it, you’d be tracing all your code.. Not very efficient. But, I think it’s a novel approach since it continues to work even as you get deeper into the nest. You can’t override ‘eval’. Although you can override execfile().