如何修复 os.path.join(os.getcwd(), os.relpath('my_file')) 不返回 'my_file' 的路径?

How to fix os.path.join(os.getcwd(), os.relpath('my_file')) not returning the path to 'my_file'?

我有以下工作目录:/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 中正常工作。该代码当前位于 运行ning 测试文件中,位于 /Users/jordan/Coding/Employer/code_base/framework/GTC/tests/test.py.

我已经在 os.join 中尝试过 os.path.relpath('day_document.json')os.path.abspath('day_document.json'),return /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

根据[Python 3.Docs]: os.path.relpath(path, start=os.curdir)强调是我的):

... This is a path computation: the filesystem is not accessed to confirm the existence or nature of path or 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)

不用说,如果在目录树中有多个同名文件,第 1st 个将被返回(并且不能保证它会被返回)你期待的那个)。