我有以下项目结构
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.py
和data_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是朝着正确方向迈出的一步吗?
提前谢谢。
答案 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。