在 python 项目中的什么地方放置绝对路径?

Where to place absolute paths in a python project?

我有以下项目结构

ts_tools
    /bin
    /docs
    /lib
    /ts_tools
        /data_transfer
            /tests
            data_import.py
            __init__.py
        /data_manipulation
            /tests
            data_smoothing.py
            __init__.py
        __init__.py
    config.yaml.conf
    setup.py
    LICENSE
    README.md
    TODO.md

我想从外部来源使用 data_import.py 文件导入数据。我使用 config.yaml.conf 文件指定数据的绝对路径:

root_path:
    windows:
        data_fundamental: C:\Users\Malcom\Data_Fundamental
        data_event: C:\Users\Malcom\Data_Event
    linux:
        data_fundamental: /home/data/data_fundamental
        data_event: /home/data/data_event

ts_tools 包中的所有工具(即 data_import.pydata_smoothing.py)中的所有工具都应该可以使用相应的路径。此外,程序应识别 os 并相应地选择 ose 路径结构。

我知道如何使用

设置 yaml 文件的路径
import yaml

with open("config.yaml.conf", "r") as ymlfile:
    cfg = yaml.load(ymlfile)

而且我知道如何区分 os 和

if platform.system().lower() == 'windows':
    ROOT_DATA_PATH = cfg['windows']
else:
    ROOT_DATA_PATH = cfg['linux']

但我不知道将这些代码片段放在哪里。我认为在 setup.py 文件中使用它不合适。另一方面,我认为指定一个新的 .py 文件是不合适的。这个问题的好的设计结构是什么?应该在哪里指定绝对文件路径?我的 ansatz 是朝着正确方向迈出的一步吗?

提前致谢。

在这种情况下,您可以使其相对于主目录,因此您可以拥有 ~/data_fundamental~/data_event(这在两个平台上应该是等效的)。您可以使用 os.path.expandhome

扩展它
import os.path

def get_path(s):
    return os.path.normpath(os.path.normcase(
        os.path.expanduser(os.path.expandvars(s))
    ))

# get_path('~/data_fundamental') on Windows:
#    r'c:\users\malcom\data_fundamental'
# get_path('~/data_fundamental') on Linux:
#    r'/home/data/data_fundamental'
# (Assuming your username on Windows is Malcolm
#  and on Linux is data and you haven't changed
#  the default home path)

在任何情况下,有两个不同的设置可能会过于混乱,你应该扩展 ~%VARS%${VARS} 无论如何使设置更容易 运行 符合预期。

您的其他选择包括:

  • 从环境变量中读取
  • 将其写入 setup.py(您可能应该允许某种方式更改配置文件的位置,因为 setup.py 可能会将其置于写保护位置)

你也可以根本没有默认值,如果没有给出默认值,要么根据 sys.platform() 设置默认值,要么发出错误消息告诉用户设置它。

让我们识别两种不同类型的 files/data。

  • Files/data 由用户或在 installation/deploy
  • 期间为用户编写
  • Files/data 编码者写的

files/data 中的绝对路径可以由用户定义或由在用户计算机上执行的程序生成。 绝对路径本质上比相对路径更脆弱,但在第一种情况下还不错。

在第二种情况下,你不应该使用绝对路径。我看到您甚至为 windows 和 linux 使用了两个不同的路径。你不必这样做,也不应该这样做。

在 Python 中,您可以使用诸如 os.path.expanduser('~') 之类的东西来查找用户路径,或者像 appdirs 这样的软件包。你想尽可能跨平台,用 Python 几乎总是可以的。