Как исправить, чтобы os.path.join (os.getcwd (), os.relpath ('my_file')) не возвращал путь к 'my_file'? - PullRequest
1 голос
/ 31 мая 2019

У меня есть следующий рабочий каталог: /Users/jordan/Coding/Employer/code_base, и файл, для которого я хочу получить абсолютный путь, расположен в /Users/jordan/Coding/Employer/code_base/framework/GTC/tests/day_document.json. У меня есть тесты в файле /Users/jordan/Coding/Employer/code_base/framework/GTC/tests/test.py.

В настоящее время, когда я использую os.path.join(os.getcwd(), os.path.relpath('day_document.json'), я получаю /Users/jordan/Coding/Employer/code_base/day_document.json. Я хочу получить правильный путь к файлу day_document.json, чтобы тесты могли правильно работать в CI. Код в настоящее время выполняется в тестовом файле, расположенном по адресу /Users/jordan/Coding/Employer/code_base/framework/GTC/tests/test.py.

Я уже пробовал os.path.relpath('day_document.json') и os.path.abspath('day_document.json') в os.join, и оба возвращают /Users/jordan/Coding/Employer/code_base/day_document.json. Я также много гуглил, но, похоже, не могу найти ничего, где люди получают правильный ответ. Когда я использую os.path.join(os.getcwd(), 'framework/GTC/tests/day_document.json'), я получаю правильное поведение, но я не хочу жестко кодировать пути к файлам.

Это работает:

day_document_file_location = os.path.join(os.getcwd(), 'framework/GTC/tests/day_document.json')
with open(day_document_file_location, 'r') as day_doc_json:
    day_doc_endpoint._content = day_doc_json.read()

Но я не понимаю, почему это не так:

day_document_file_location = os.path.join(os.getcwd(), os.path.relpath('day_document.json'))
with open(day_document_file_location, 'r') as day_doc_json:
    day_doc_endpoint._content = day_doc_json.read()

Я должен отметить, что последний код работает, когда я запускаю его из расположения файла, а не из рабочего каталога.

Я хочу найти способ не жестко кодировать путь к файлу и иметь возможность получить /Users/jordan/Coding/Employer/code_base/framework/GTC/tests/day_document.json из рабочего каталога.

1 Ответ

2 голосов
/ 31 мая 2019

Согласно [Python 3.Docs]: os.path. relpath ( путь, начало = os.curdir ) ( выделение - мое):

... Это вычисление пути: к файловой системе не обращаются, чтобы подтвердить существование или природу path или start .

Если вы не хотите жестко кодировать framework / GTC / tests / day_document.json (промежуточные каталоги), вам необходимо выполнить поискдля файла.Один из способов - использовать [Python 3.Docs]: glob. iglob ( pathname, *, recursive = False ) :

document_name = "day_document.json"
document_path = ""
for p in glob.iglob(os.path.join("**", document_name), recursive=True):
    document_path = os.path.abspath(p)
    break
if not document_path:
    # Handle file not being present, e.g.:
    raise FileNotFoundError(document_name)

Нет необходимости говорить, что если у вас есть более одного файла с таким именем в дереве каталогов, будет возвращен 1 st (и нет гарантии, что это будет тот, который вы ожидаете)).

...