Как в Python - программе узнать путь до текущей директории со скриптом. Я знаю, что для этого требуется библиотека os, но там столько различных классов и функций, что можно пол дня убить на поиски.
-
связанный вопрос: Find current directory and file's directory – jfs Nov 26 '16 at 22:54
-
1ассоциация: http://stackoverflow.com/questions/5137497/find-current-directory-and-files-directory – Nicolas Chabanovsky Mar 02 '17 at 12:37
-
pwd - отображает текущую рабочую директорию – Евгений Веснин Feb 23 '18 at 08:08
5 Answers
Если вы запускаете скрипт C:\Scripts\script.py из D:\work папки:
D:\work> py C:\Scripts\script.py
то:
D:\work— это текущая рабочая директория на момент старта скрипта.open('file.txt')будет пытаться открытьD:\work\file.txtфайлC:\Scripts— это директория со скриптом.
Текущая рабочая директория
Текущая рабочая директория возвращается os.getcwd() функцией, где CWD это Current Working Directory ("текущая рабочая директория"). os.getcwdb() возвращает путь в виде байт. Происхождение функции от POSIX getcwd(3). Другие способы могут вернуть разные результаты в зависимости от настроек доступа промежуточных директорий, общей длины (от платформы зависит) итд—не изобретайте своих способов, если не осознаёте всех последствий возможного изменения в поведении функции. Также нетрадиционные способы получения рабочей директории могут ухудшить читаемость другими Питон-программистами. Из The Zen of Python
:
There should be one-- and preferably only one --obvious way to do it.
По умолчанию относительные пути используют именно эту директорию, поэтому явно вызывать os.getcwd() редко нужно. Например, open('file.txt') вызов открывает файл 'file.txt' в текущей директории. Если необходимо передать полный путь в виде строки, то можно использовать os.path.abspath('file.txt')—getcwd() снова явно не используется.
Path.cwd() из pathlib модуля возвращает путь к текущей директории как объект c разными полезными и удобными методами такими как .glob('**/*.py').
Директория со скриптом
Текущая рабочая директория может отличаться от директории с текущим Питон-скриптом. Часто, но не всегда можно os.path.dirname(os.path.abspath(__file__)) использовать, чтобы получить директорию с текущим Питон скриптом, но это не всегда работает. Посмотрите на get_script_dir() функцию, которая поддерживает более общий случай.
Если хочется получить данные из файла, расположенного относительно установленного Питон-модуля, то используйте pkgutil.get_data() или setuptools' pkg_resources.resource_string() вместо построения путей c помощью __file__. Это работает даже, если ваш пакет упакован в архив. В Python 3.7 появился importlib.resources модуль. К примеру, если у вас есть Питон пакет data внутри которого лежит файл.txt, то чтобы достать текст:
import importlib.resources
text = importlib.resources.read_text('data', 'файл.txt')
Если вы хотите найти место куда пользовательские данные можно положить, то appdirs модуль предоставляет переносимый способ:
import appdirs # $ pip install appdirs
user_data_dir = appdirs.user_data_dir("Название приложения", "Кто создал")
Разные платформы (Windows, MacOS, Linux) используют разные соглашения, appdirs позволяет не плодить сущностей и использовать на каждой платформе подходящие директории.
- 52,361
Получить текущую директорию, где запущен скрипт
dir = os.path.abspath(os.curdir)Получить текущую директорию, где расположен скрипт
os.path.abspath(__file__)
-
2
-
2
getcwdвынуждает меня помнить расшифровку этого акронима. Лучше бы они назвали это так:getCurrentDirectoryи даже думать не надо! А мой способ имяabspathбыстрее намекает проabs path, что это если не абсолютный путь? Хорошее имя - меньше боли. – sys_dev Jun 15 '16 at 12:39 -
-
2@approximatenumber, в предложенном варианте функция также одна (
os.curdir- не функция). С другой стороны, имяcurdirне сильно лучшеgetcwd, которая, думаю, реализованаreturn os.curdir))) – andy.37 Jun 15 '16 at 13:24 -
@approximatenumber: Не экономьте на кол-ве функций экономьте на себе любимом, который придет в какой-нить понедельник "с будуна" и будет пытаться понять код. Надо использовать ЛЮБУЮ возможность Зделать код понятнее ;) – sys_dev Jun 15 '16 at 13:59
-
2минус за изобретение велосипеда—подумайте о тех, кто ваш код будет читать. Не нужно своих способов придумывать вместо вызова стандартной функции. – jfs Jun 15 '16 at 23:13
-
getcwdпроще запомнить, поскольку функции с тем же именем применяются и в C и в PHP, и где только еще не – strangeqargo Jun 15 '16 at 23:13 -
@jfs: 1. Автор вопрос задал задачу с текущей директорией. Задача решена? Или те способы что я предложил задачу не решают? 2. Ранее в СССР тоже было приняты стандартные вещи что-то вроде ИЖМАШСТРОЙ и это ни к чему хорошему не приводило! 3. Те вещи что я предложил они не стандартны? Чем конкретно? – sys_dev Jun 16 '16 at 08:46
os.path.abspath(__file__) -
возвращает то, что надо - путь до физического расположения файла скрипта.
Но он добавляет в него имя самого скрипта, которое придётся программно откусить чтобы получить именно путь.
dir = os.path.abspath(os.curdir) - возвращает вообще ненужную хрень. В винде это будет
C:\Users\[имяюзера]
Задача стандартная для работы с файлами, по дефолту лежащими в той же директории, что и скрипт. Сейчас, как раз, такую решаю.
- 49,104
- 11
- 1
-
Извините, а чем ваш ответ отличается от предложенных ранее ответов, например, от этого? Какую новую информацию он несёт? – 0xdb Aug 09 '20 at 11:34
-
Если
dir = os.path.abspath(os.curdir)у вас возвращаетC:\Users\[имяюзера], значит скрипт запущен из этой папки (например, так будет, если вы запустили cmd из этой папки, потом запустили скрипт по полному пути команднойpython c:\somedir\script.py) – insolor Aug 09 '20 at 11:43
Для получения расположения нужной директории с файлом можно использовать это:
import os
a = os.path.basename(__file__)
b = os.path.abspath(__file__).replace(a, '')
Тогда мы получим путь к директории без названия файла.
- 11
Вы можете получить путь к текущей директории с помощью функции os.getcwd из модуля os:
import os
current_dir = os.getcwd()
print(current_dir)
Этот код выведет путь к текущей директории в консоли. Например, если скрипт находится в папке /home/user/my_project, то на консоль будет выведено /home/user/my_project.
Обратите внимание, что os.getcwd возвращает путь к текущей директории в формате, принятом в вашей операционной системе. На Windows это будет, например, C:\Users\user\my_project, а на Unix-подобных системах (таких как Linux и MacOS) - /home/user/my_project.
Если вам нужно получить не только путь к текущей директории, но и имя файла скрипта, вы можете использовать функцию os.path.realpath из модуля os.path:
import os
script_path = os.path.realpath(file)
print(script_path)
Этот код выведет полный путь к файлу скрипта, включая имя файла. Например, если скрипт называется myscript.py и находится в папке /home/user/my_project, то на консоль будет выведено /home/user/my_project/myscript.py.
Обратите внимание, что этот способ работает только внутри скрипта. Если вы запускаете Python интерпретатор из командной строки и хотите узнать путь к текущей директории, вам нужно будет использовать os.getcwd.
Еще один способ получить путь к текущей директории - это использовать модуль pathlib:
from pathlib import Path
current_dir = Path.cwd()
print(current_dir)
Этот код также выведет путь к текущей директории
- 9,569