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



我不认为我的问题是特定于FastAPI的,但更多的是Python-virtualenv通用的,但这里是我使用FastAPI的例子。

我从Pipenv设置的虚拟环境中运行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 dev server withpipenv run uvicorn myproject.web:app --reload.

现在工作,但我想避免这个绝对路径在我的公共源代码。任何相对路径都不起作用,因为它似乎是相对于Pipenv创建的虚拟环境中的安装路径,这是不确定的。__file__路径也是如此;它在一个虚拟环境中

我还考虑将静态数据作为数据文件添加到Python包中,并从pkg_resources(例如pkg_resources.resource_filename('myproject', 'data/'))提供的目录中加载它,但我不打算将静态数据与Python包一起发布到生产环境中,因此感觉有点粗糙。

是否有可能通过相对路径链接到这里的正确目录,或者您是否有另一个聪明的想法,以便在开发团队中共享项目(或在GitHub上公开)稍微好一点?

因为你想灵活地从它将运行的位置和静态的位置是不相关的,任何恒定的相对路径都不能工作。

我会选:

  1. 通过一些启发式方法发现静态点,例如走回某个已知的"锚点";目录(根目录?)

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

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

相关内容

  • 没有找到相关文章

最新更新