如何在 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 上)好一点了吗?
因为你想从哪里灵活 运行 并且静态位置无关,所以任何恒定的相对路径都不起作用。
我会选择:
- 通过一些启发式方法发现静力学,例如返回某个已知的“锚点”文件夹(根文件夹?)
我已经做过一次这样的事情,甚至将找到的绝对路径结果缓存在一些持久的临时文件中,因此这种发现只会在每台机器上发生一次(除非位置移动或临时缓存文件被删除)。
- 将静态位置设置为服务器启动时使用的 config/command-line/both 参数。
我不认为我的问题是特定于 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 上)好一点了吗?
因为你想从哪里灵活 运行 并且静态位置无关,所以任何恒定的相对路径都不起作用。
我会选择:
- 通过一些启发式方法发现静力学,例如返回某个已知的“锚点”文件夹(根文件夹?)
我已经做过一次这样的事情,甚至将找到的绝对路径结果缓存在一些持久的临时文件中,因此这种发现只会在每台机器上发生一次(除非位置移动或临时缓存文件被删除)。
- 将静态位置设置为服务器启动时使用的 config/command-line/both 参数。