【问题标题】:How to create a pathlib relative path with a dot starting point?如何创建一个以点为起点的 pathlib 相对路径?
【发布时间】:2020-07-02 00:28:03
【问题描述】:

我需要创建一个以当前目录开头的相对路径作为“。”点

例如,在 windows “.\envs\.some.env” 或 “./envs/.some.env” 其他地方

我想使用 pathlib 来做到这一点。找到了一个解决方案,但它有一个笨拙的替换语句。有没有更好的方法来使用 pathlib?

使用的是django-environ,目标是支持多个env文件。工作文件夹包含一个 envs 文件夹,该文件夹中有多个 env 文件。

import environ
from pathlib import Path
import os

domain_env = Path.cwd()

dotdot = Path("../")
some_env = dotdot / "envs" / ".some.env"

envsome = environ.Env()
envsome.read_env(envsome.str(str(domain_env), str(some_env).replace("..", ".")))  

print(str(some_env))
print(str(some_env).replace("..", "."))

dot = Path("./")    # Path(".") gives the same result
some_env = dot / "envs" / ".some.env"

print(str(some_env))

在 windows 上给出:

..\envs\.some.env
.\envs\.some.env
envs\.some.env

【问题讨论】:

  • 为什么envs\.some.env 不够用?对于Path('envs\\.some.env').open()Path('.\\envs\\.some.env').open() 等常见用途,它们应该是相同的。
  • `.\`是当前目录,可以省略。
  • 感谢您的快速回复。使用 django-environ 模块,我可以使它工作的唯一方法是使用当前目录的点。然后我想迁移到 pathlib 解决方案。
  • 是的,这会起作用,而且有些地方 os 库的功能比 pathlib 更多。这可能是这些地方之一。我想知道是否有一个 pathlib 方法。
  • 我刚才有这个 exact 问题,因为我正在创建一个路径,我要传递给 nodejs require() 语句,其中 ./something.jssomething.js 被解释不同。

标签: python django environment-variables pathlib


【解决方案1】:

我能找到的最好的是(正如metatoaster in the question’s comments 所建议的那样):

os.path.join(".", some_env)

其中some_env 可以是字符串或bytes 或(since Python 3.6) 任何path-like object(这意味着您不必再将Path 对象转换为字符串)。

因为有些人想知道为什么这可能有用:

  • 当前目录中的shell脚本foo.sh不能被foo.sh调用(除非.$PATH中),而是必须使用./foo.sh调用。
  • 作为Boris explained,在Node.js require() 语句中foo./foo 之间存在差异。
  • 我自己需要这个来为ExifTool创建一个文件名参数,保证不会被解析为命令行选项,即使文件名为-quiet。 ExifTool 不遵守 Unix 约定,即有一个 -- 参数表示所有以下参数不是选项,官方的 suggestion by its author 是“[p]ut the directory name before the file name if the file名称以破折号开头”。

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 2016-07-21
    • 2017-10-25
    • 2021-08-15
    • 2019-06-21
    • 2019-03-12
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多