Вопрос-Ответ

Find the current directory and file's directory [duplicate]

Найдите текущий каталог и директорию файла [дубликат]

Как мне определить:


  1. текущий каталог (где я был в командной оболочке, когда запускал скрипт Python) и

  2. где находится файл Python, который я выполняю?

Переведено автоматически
Ответ 1

Чтобы получить полный путь к каталогу, в котором содержится файл Python, напишите это в этом файле:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__))

(Обратите внимание, что приведенное выше заклинание не сработает, если вы уже использовали его os.chdir() для изменения текущего рабочего каталога, поскольку значение __file__ константы относится к текущему рабочему каталогу и не изменяется os.chdir() вызовом.)


Чтобы получить текущий рабочий каталог, используйте

import os
cwd = os.getcwd()

Ссылки на документацию для модулей, констант и функций, использованных выше:


  • Модули os и os.path.

  • Константа __file__

  • os.path.realpath(path) (возвращает "канонический путь к указанному имени файла, исключая любые символические ссылки, встречающиеся в пути")

  • os.path.dirname(path) (возвращает "имя каталога, равное имени пути path")

  • os.getcwd() (возвращает "строку, представляющую текущий рабочий каталог")

  • os.chdir(path) ("измените текущий рабочий каталог на path")

Ответ 2

Текущий рабочий каталог: os.getcwd()

А __file__ атрибут может помочь вам узнать, где находится файл, который вы запускаете. В этом сообщении Stack Overflow все объясняется: Как мне получить путь к текущему исполняемому файлу в Python?

Ответ 3

Возможно, это пригодится вам в качестве справки:

import os

print("Path at terminal when executing this file")
print(os.getcwd() + "\n")

print("This file path, relative to os.getcwd()")
print(__file__ + "\n")

print("This file full path (following symlinks)")
full_path = os.path.realpath(__file__)
print(full_path + "\n")

print("This file directory and name")
path, filename = os.path.split(full_path)
print(path + ' --> ' + filename + "\n")

print("This file directory only")
print(os.path.dirname(full_path))
Ответ 4

pathlib Модуль, представленный в Python 3.4 (PEP 428 — Модуль pathlib — пути к объектно-ориентированной файловой системе), значительно улучшает работу с path, связанную с path.

pwd

/home/skovorodkin/stack

tree

.
└── scripts
├── 1.py
└── 2.py

Чтобы получить текущий рабочий каталог, используйте Path.cwd():

from pathlib import Path

print(Path.cwd()) # /home/skovorodkin/stack

Чтобы получить абсолютный путь к файлу вашего скрипта, используйте метод Path.resolve():

print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py

А чтобы получить путь к каталогу, в котором находится ваш скрипт, выполните access .parent (рекомендуется вызвать .resolve() перед .parent):

print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts

Помните, что в некоторых ситуациях это __file__ ненадежно: Как мне получить путь к текущему исполняемому файлу в Python?.


Пожалуйста, обратите внимание, что Path.cwd(), Path.resolve() и другие Path методы возвращают объекты path (PosixPath в моем случае), а не строки. В Python 3.4 и 3.5 это вызвало некоторую боль, потому что open встроенная функция могла работать только со строковыми или байтовыми объектами и не поддерживала Path объекты, поэтому вам пришлось преобразовать Path объекты в строки или использовать Path.open() метод, но последний вариант потребовал от вас изменения старого кода:

Файл scripts/2.py

from pathlib import Path

p = Path(__file__).resolve()

with p.open() as f: pass
with open(str(p)) as f: pass
with open(p) as f: pass

print('OK')

Вывод

python3.5 scripts/2.py

Traceback (most recent call last):
File "scripts/2.py", line 11, in <module>
with open(p) as f:
TypeError: invalid file: PosixPath('/home/skovorodkin/stack/scripts/2.py')

Как вы можете видеть, open(p) не работает с Python 3.5.

PEP 519 — Добавление протокола пути к файловой системе, реализованного в Python 3.6, добавляет поддержку PathLike объектов в open функцию, так что теперь вы можете передавать Path объекты в open функцию напрямую:

python3.6 scripts/2.py

OK
python