如何在 virtualenv/Pipenv 中 运行 时指向相对于 Python 文件的文件夹?

How to point to a folder relative to Python file when running in virtualenv/Pipenv?

我不认为我的问题是特定于 FastAPI 的,而是更多 Python-virtualenv 通用的,但无论如何这是我使用 FastAPI 的示例用例。

我是 运行 来自 Pipenv 设置的 virtualenv 的 FastAPI,我希望它只为开发目的提供静态文件。我知道这可以通过适当的生产部署解决,我将为此使用适当的 Web 服务器,但我下面的问题是关于开发环境的。

文件结构如下所示:

├── frontend          <-- frontend code dir
│   ├── dist          <-- frontend build output (static files)
│   ├── public
│   └── [..]
├── Pipfile           <-- contains 'myproject = {editable = true, path = "."}' as dep
├── Pipfile.lock
├── setup.cfg
├── setup.py
├── myproject         <-- backend code dir
│   ├── web.py        <-- fastapi file
│   └── [...]
└── [...]

myproject/web.py:

import fastapi

app = fastapi.FastAPI()
app.mount("/", fastapi.staticfiles.StaticFiles(
    directory="/absolute/path/to/frontend/dist"),
    name="static",
)

运行 FastAPI 开发服务器 pipenv run uvicorn myproject.web:app --reload.

现在有效,但我想在我的 public 源代码中避免使用此 绝对路径 。任何相对路径都不起作用,因为它似乎是相对于 Pipenv 创建的 virtualenv 中的安装路径,这是不确定的。 __file__ 路径也是如此;它在 virtualenv 中。

我也考虑过将静态数据作为数据文件添加到 Python 包中,并从 pkg_resources 提供的目录中加载它(例如 pkg_resources.resource_filename('myproject', 'data/')),但是我不打算在生产中使用 Python 包发送静力学,所以感觉很老套。

是否可以通过相对路径以某种方式 link 此处的正确目录,或者您是否有其他聪明的想法以便在开发团队中共享项目(或 publicly在 GitHub 上)好一点了吗?

因为你想从哪里灵活 运行 并且静态位置无关,所以任何恒定的相对路径都不起作用。

我会选择:

  1. 通过一些启发式方法发现静力学,例如返回某个已知的“锚点”文件夹(根文件夹?)

我已经做过一次这样的事情,甚至将找到的绝对路径结果缓存在一些持久的临时文件中,因此这种发现只会在每台机器上发生一次(除非位置移动或临时缓存文件被删除)。

  1. 将静态位置设置为服务器启动时使用的 config/command-line/both 参数。