【问题标题】:Where to place absolute paths in a python project?在 python 项目中将绝对路径放在哪里?
【发布时间】:2017-08-31 20:34:32
【问题描述】:

我有以下项目结构

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)都应该可以使用相应的路径。此外,程序应识别操作系统并相应地选择路径结构。

我知道如何使用 yaml 文件设置路径

import yaml

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

我知道如何区分操作系统

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

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

提前谢谢你。

【问题讨论】:

    标签: python absolute-path


    【解决方案1】:

    在这种情况下,您可以使其相对于主目录,因此您可以拥有~/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() 设置默认值或引发错误消息告诉用户进行设置。

    【讨论】:

      【解决方案2】:

      让我们识别两种不同类型的文件/数据。

      • 在安装/部署期间由用户或为用户写入的文件/数据
      • 编码器写入的文件/数据

      可以在文件/数据中包含由用户定义或由在用户计算机上执行的程序生成的绝对路径。 绝对路径本质上比相对路径更脆弱,但在第一种情况下并没有那么糟糕。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        • 2020-09-02
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多