【问题标题】:How to access a file a path level below from a subfolder如何从子文件夹访问低于路径级别的文件
【发布时间】:2020-01-31 15:24:13
【问题描述】:

假设我的当前目录中有一个名为credentials.json 的文件、一个环境变量MY_CREDENTIALS=credentials.json 和一个通过os.getenv('MY_CREDENTIALS') 使用此环境变量的脚本main.py

现在假设我创建了一个子文件夹并在其中放置如下内容:/subfolder/my_other_script.py。 如果我打印os.getenv('MY_CREDENTIALS'),那么我确实得到credentials.json,但我不能使用这个文件,因为它在我的根目录中(不在/subfolder 中)。那么,尽管它位于根目录中,但如何使用此文件?唯一对我有用的是在/subfolder 中制作credentials.json 的副本,但是我将拥有该文件的多个副本,我不希望这样。

感谢您的回复!

【问题讨论】:

  • 为什么不将环境变量设置为绝对路径?
  • @bluesummers 因为我需要将它部署到云端,同时让我的 Dockerfile 和 YAML 尽可能简单。
  • by YAML 我相信你的意思是 docker-compose 文件,所以如果你多讲一点用例,它会更容易提供帮助
  • 你不能在变量MY_CREDENTIALS=/path/to/credentials.json中放一个目录吗?在开发时放置一个不同的(可能是相对的)路径,并在生产 Docker 实例中放置一个硬绝对路径。
  • @tripleee 如果我复制凭据的绝对路径,它会给我这样的信息:/home/user/Desktop/myproject/credentials.json 然后我可以在my_other_script.py 中完美使用它。但是如果我复制相对路径,我只会得到credentials.json,然后我会遇到问题,因为子文件夹无法访问此文件。

标签: python python-3.x environment-variables credentials


【解决方案1】:

这样的事情可能会起作用:

from pathlib import Path
import os

FILENAME = os.getenv('MY_CREDENTIALS')
filePath = Path(FILENAME)

if filePath.exists() and filePath.is_file():
    print("Success: File exists")
    print(filePath.read_text())
else:
    print("Error: File does not exist. Getting file from level below.")
    print((filePath.absolute().parent.parent / filePath.name).read_text())

基本上,您检查您的文件是否存在于当前文件夹中。如果您的脚本位于根文件夹中,就会出现这种情况。如果不是,则假设您在子文件夹中。因此,您尝试从下一级(您的根目录)获取文件。 它还没有完全准备好生产,但是对于您提到的特定情况,它应该可以工作。在生产中,您应该考虑可能有嵌套子文件夹或文件永远丢失的情况。

【讨论】:

    【解决方案2】:

    你可以创建符号链接

    os.symlink('<root>', '<subfolder>')
    

    https://docs.python.org/3/library/os.html#os.symlink

    【讨论】:

    • 你能举个例子吗?我不确定如何使用它。
    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多