В Python, какие команды я могу использовать для поиска:
- текущий каталог (где я находился в терминале при запуске Python script) и
- Где выполняется файл, который я выполняю?
В Python, какие команды я могу использовать для поиска:
Чтобы получить полный путь к каталогу, в который содержится файл 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
" ) Текущий рабочий каталог: os.getcwd()
А \_\_file\_\_ attribute
поможет вам узнать, где находится исполняемый файл. Этот пост SO объясняет все: Как мне получить путь к текущему исполняемому файлу в Python?
Вы можете найти это полезным в качестве ссылки:
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))
1.Чтобы получить полный путь к текущему каталогу
>>import os
>>print os.getcwd()
o/p: "C:\Users\admin\myfolder"
1.Чтобы получить только текущее имя папки каталога
>>import os
>>str1=os.getcwd()
>>str2=str1.split('\\')
>>n=len(str2)
>>print str2[n-1]
о/р: "MyFolder"
Если вы пытаетесь найти текущий каталог файла, в котором вы сейчас находитесь:
Агностический способ ОС:
dirname, filename = os.path.split(os.path.abspath(__file__))
pathlib
, введенный в Python 3.4 (PEP 428 - Модуль pathlib - пути объектно-ориентированной файловой системы), значительно улучшает работу, связанную с трассировкой.
$ 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
И чтобы получить путь к каталогу, где находится ваш скрипт, откройте его .parent
(рекомендуется вызвать .resolve()
до .parent
):
print(Path(__file__).resolve().parent) # /home/skovorodkin/stack/scripts
Помните, что __file__
не является надежным в некоторых ситуациях: как мне получить путь к текущему исполняемому файлу в Python? ,
Обратите внимание, что Path.cwd()
, Path.resolve()
и другие методы Path
возвращают объекты пути ( PosixPath
в моем случае), а не строки. В Python 3.4 и 3.5 это вызвало некоторую боль, поскольку open
встроенная функция могла работать только со строковыми или байтовыми объектами и не поддерживала объекты Path
, поэтому вам пришлось преобразовывать объекты Path
в строки или использовать Path.open()
но последний вариант потребовал от вас изменить старый код:
$ cat 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 3.4, есть новый модуль более высокого уровня pathlib
, который позволяет вам удобно вызвать pathlib.Path.cwd()
, чтобы получить объект Path
, представляющий ваш текущий рабочий каталог, а также многие другие новые особенности.
Дополнительную информацию об этом новом API можно найти здесь.
Немного поздно для вечеринки, но я думаю, что самый краткий способ найти только имя вашего текущего контекста выполнения будет
current_folder_path, current_folder_name = os.path.split(os.getcwd())
Ответ на # 1:
Если вы хотите использовать текущий каталог, сделайте следующее:
import os
os.getcwd()
Если вы хотите только любое имя папки и у вас есть путь к этой папке, сделайте следующее:
def get_folder_name(folder):
'''
Returns the folder name, given a full folder path
'''
return folder.split(os.sep)[-1]
Ответ на # 2:
import os
print os.path.abspath(__file__)
Если вы ищете местоположение текущего выполненного script, вы можете использовать sys.argv[0]
для получения полного пути.
Чтобы получить полный путь к текущему каталогу:
os.path.realpath( '')
Pathlib можно использовать таким образом, чтобы получить каталог, содержащий текущий script:
import pathlib
filepath = pathlib.Path(__file__).resolve().parent
Чтобы увидеть текущий тип рабочего каталога следующего сценария:
import os
current_working_directory = os.getcwd()
Получить ваш рабочий каталог в Python. Вы можете использовать следующий код:
import os
cwd = os.getcwd() #to get current working directory
print(cwd)
В вопросе 1 используйте os.getcwd() # get working dir
и os.chdir(r'D:\Steam\steamapps\common') # set working dir
Я рекомендую использовать sys.argv[0]
для вопроса 2, потому что sys.argv
является неизменным и поэтому всегда возвращает текущий файл (путь объекта объекта) и не влияет на os.chdir()
. Также вы можете сделать следующее:
import os
this_py_file = os.path.realpath(__file__)
# vvv Below comes your code vvv #
но этот фрагмент и sys.argv[0]
не будут работать или будут работать wierd при компиляции PyInstaller, потому что магические свойства не установлены на уровне __main__
, а sys.argv[0]
- это способ, которым вызвал ваш exe (означает, что на него влияет рабочий каталог).