在python项目中放置绝对路径的位置?

时间:2017-08-31 20:34:33

标签: python absolute-path

我有以下项目结构

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)

我知道如何区分os与

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

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

提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

在用户定义的文件/数据中或由用户机器上执行的程序生成的绝对路径可以是可以的。 绝对路径本质上比相对路径更脆弱,但在第一种情况下并不坏。

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

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