os.path.realpath (__ file__) не возвращает ожидаемый путь - PullRequest
0 голосов
/ 30 марта 2020

Я запускаю свой скрипт как:

python3 tools/debug_tool.py

Я печатаю __file__ внутри скрипта, все в порядке:

tools/debug_tool.py

Но os.path.realpath(__file__) неверно:

/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/Resources/tools/debug_tool.py

Тот же результат для os.path.abspath(__file__)

Почему это происходит?

Ожидаемый результат os.path.realpath(__file__) примерно такой:

/Users/my_user/my_project/tools/debug_tool.py

Также, когда я сохраняю файл в текущем каталоге, например cv2.imwrite('temp.png', image), он также сохраняет файл в /usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/Resources/

По какой-то причине os.getcwd():

/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/Resources

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я не могу воспроизвести - работает для меня. Вы не опубликовали фактический код, который вы используете. Я создал файл с именем tmp / d.py относительно $HOME со следующим содержимым:

import os
print("__file__: " + __file__)
print("realpath: " + os.path.realpath(__file__))

Запуск его с установленным Homebrew python3, /usr/local/bin/python3 tmp/d.py, производит ожидаемый результат:

__file__: tmp/d.py
realpath: /Users/krader/tmp/d.py

Если это не дает того же результата в вашей системе, что-то серьезно сломано :-) Но я подозреваю, что вы не точно описали проблему.

0 голосов
/ 30 марта 2020

os.path.realpath должен разрешать символьные c ссылки и возвращать канонический путь:

Возвращать канонический путь указанного имени файла, исключая любые символы c ссылки, встречающиеся в пути (если они поддерживаются операционной системой).

Обратите внимание, что вам также необходимо разрешить каталог файла:

os.path.realpath(os.path.dirname(__file__))

Если вы ищете абсолютный путь без разрешения символьных c ссылок, вам нужно использовать os.path.abspath:

Возвращать нормализованную абсолютную версию пути пути. На большинстве платформ это эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)).

os.path.abspath(os.path.dirname(__file__))

должен генерировать требуемый вывод:

/Users/my_user/my_project/tools/debug_tool.py

Если ничего из вышеперечисленного не работает, это означает, что ваш текущий рабочий каталог отличается от того, который вы думали. Например, если вы используете IDE, возможно, стоит проверить ваш текущий рабочий каталог:

print(os.getcwd())
...