在 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.py
和 data_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 几乎总是可以的。
我有以下项目结构
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
)中的所有工具都应该可以使用相应的路径。此外,程序应识别 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 几乎总是可以的。