python - 管理 Python 项目中的路径
问题描述
有没有更有效的方法来处理 Python 中的硬编码路径?我发现自己处于以下情况,我将字符串附加到所需的目录中,但如果我要移动文件,我不想无意中破坏代码。有没有办法在配置文件中标记这些目录路径,然后从该位置管理它们?如果有怎么办?
scripts_path = os.path.dirname(os.path.abspath(__file__)) + "/../scripts"
解决方案
将数据文件放在哪里是一个常见问题,不同的应用程序以不同的方式处理它。一些想法:
- 标准化目录以读取相对于指定此配置文件的所有文件或配置文件的位置,然后将所有要读取的文件放在那里。这被 Apache 服务器、nginx、Vim 和许多其他程序使用。实际上有一个规范告诉你应该把它放在哪里。它没有被普遍遵循,但我喜欢它。
例如,要自定义 Vim 应用,在类 Unix 操作系统中放入 config~/.vimrc
和其他配置(Windows 有相应的位置)~/.vim
- 通过环境变量或命令行参数将配置传递给应用程序。大多数旨在通过 Docker 运行的应用程序都使用这种方法。
例子:
myapp --script-dir=../scripts
或myapp --config conf.cfg
或APP_NAME_DIR=/tmp myapp
- 将数据烘焙到可部署中。对于 Python,您可以使用MANIFEST.in文件将其 pip 打包。这种方法由数据是只读的应用程序使用(这听起来像你的情况),并且它更容易部署。Flask文档有一些关于如何做到这一点的注释。
您可以结合其中一些方法。也许您希望您的应用程序首先在环境变量(如<app_name>_base_dir
)中查找基本目录名称,如果不存在,则在~/.config/<app_name>
或其他地方。我建议您查看一些您最喜欢的应用程序是如何解决这个问题的,以获得更多灵感。
一旦您从某个地方获得了 base_dir 路径,我强烈建议您使用该pathlib
库来操作路径。它带有较新版本的 Python,并允许您执行以下操作:
from pathlib import Path
base_dir = Path(__file__).parent # consider approaches above to get base_dir
script_dir = base_dir / 'scripts'
print(script_dir)
# prints: <location of this file>/scripts
推荐阅读
- angular - 使用 angular-cdk 创建叠加层中的垂直滚动
- node.js - Express app mongoDB,什么是昂贵的操作?
- iot - Contiki OS:设置混杂模式并接收所有 UDP 数据包
- git - gitlab 备份是否包含存储库中的实际文件?
- kendo-ui - 在 C# 中验证 kendoUI DataSourceRequest 对象
- javascript - 调整浏览器窗口大小时如何获取 HTML 元素的位置?
- c# - Xamarin XML 智能感知不起作用
- python-3.x - Python Selenium:Send_keys 无法执行
- google-maps-api-3 - 不使用 bounds.extend(point) 扩展地图边界的正确方法
- php - 用斜杠分隔 URL Codeigniter