首页 > 解决方案 > 管理 Python 项目中的路径

问题描述

有没有更有效的方法来处理 Python 中的硬编码路径?我发现自己处于以下情况,我将字符串附加到所需的目录中,但如果我要移动文件,我不想无意中破坏代码。有没有办法在配置文件中标记这些目录路径,然后从该位置管理它们?如果有怎么办?

scripts_path = os.path.dirname(os.path.abspath(__file__)) + "/../scripts"

标签: python

解决方案


将数据文件放在哪里是一个常见问题,不同的应用程序以不同的方式处理它。一些想法:

  • 标准化目录以读取相对于指定此配置文件的所有文件或配置文件的位置,然后将所有要读取的文件放在那里。这被 Apache 服务器、nginx、Vim 和许多其他程序使用。实际上有一个规范告诉你应该把它放在哪里。它没有被普遍遵循,但我喜欢它。

例如,要自定义 Vim 应用,在类 Unix 操作系统中放入 config~/.vimrc和其他配置(Windows 有相应的位置)~/.vim

  • 通过环境变量或命令行参数将配置传递给应用程序。大多数旨在通过 Docker 运行的应用程序都使用这种方法。

例子:

myapp --script-dir=../scriptsmyapp --config conf.cfgAPP_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

推荐阅读