如何制作python配置文件,其中定义了相对路径,但是当其他目录中的脚本导入配置时,路径是正确的?
How to make python config file, in which relative paths are defined, but when scripts in other directories import config, paths are correct?
我在 python 中编写的程序具有以下目录结构:
\code\
main.py
config.py
\module_folder1\
script1.1.py
\data\
data_file1
data_file2
我的config.py
是一组全局变量,由用户设置,或者一般是一直固定的。特别是 config.py
定义了 2 个数据文件的路径变量,类似于 path1 = os.path.abspath("../data/data_file1")
。主要用途是 运行 main.py
导入 config
(和我写的其他模块),一切都很好。
但有时我需要自己运行 script1.1.py
。好的,没问题。我可以添加到 script1.1
通常的 if __name__ == '__main__':
并且我可以导入 config
。但后来我得到 path1 = "../code/data/data_file1"
不存在。我认为由于路径是在 config.py
中创建的,因此路径将相对于 config.py
所在的位置,但事实并非如此。
所以问题是,我怎样才能有一个定义相对路径的中央配置文件,这样我就可以将配置文件导入不同目录中的脚本并且路径仍然正确?
我应该提一下,代码库将在多台机器之间共享,因此硬编码绝对路径不是一种选择。
- 您知道
config.py
所在目录的文件的正确相对路径
- 您知道
config.py
所在目录的正确相对路径(在您的情况下,..
)
这两个东西都是独立于系统的,除非你改变你的项目结构,否则不会改变。只需使用 os.path.join('..', config.path_repative_to_config)
将它们相加即可
(不确定是谁将此作为评论发布,然后将其删除,但它似乎有效,所以我将其作为答案发布。)诀窍是在配置文件中使用 os.path.dirname(__file__)
,它给出配置文件的目录 (/code/
) 而不管导入配置的脚本在哪里。
具体回答问题,在config文件中定义
path1 = os.path.abspath(os.path.join(os.path.join(os.path.join( os.path.dirname(__file__) , '..'), 'data' ), 'data_file1' ) )
我在 python 中编写的程序具有以下目录结构:
\code\
main.py
config.py
\module_folder1\
script1.1.py
\data\
data_file1
data_file2
我的config.py
是一组全局变量,由用户设置,或者一般是一直固定的。特别是 config.py
定义了 2 个数据文件的路径变量,类似于 path1 = os.path.abspath("../data/data_file1")
。主要用途是 运行 main.py
导入 config
(和我写的其他模块),一切都很好。
但有时我需要自己运行 script1.1.py
。好的,没问题。我可以添加到 script1.1
通常的 if __name__ == '__main__':
并且我可以导入 config
。但后来我得到 path1 = "../code/data/data_file1"
不存在。我认为由于路径是在 config.py
中创建的,因此路径将相对于 config.py
所在的位置,但事实并非如此。
所以问题是,我怎样才能有一个定义相对路径的中央配置文件,这样我就可以将配置文件导入不同目录中的脚本并且路径仍然正确?
我应该提一下,代码库将在多台机器之间共享,因此硬编码绝对路径不是一种选择。
- 您知道
config.py
所在目录的文件的正确相对路径 - 您知道
config.py
所在目录的正确相对路径(在您的情况下,..
)
这两个东西都是独立于系统的,除非你改变你的项目结构,否则不会改变。只需使用 os.path.join('..', config.path_repative_to_config)
(不确定是谁将此作为评论发布,然后将其删除,但它似乎有效,所以我将其作为答案发布。)诀窍是在配置文件中使用 os.path.dirname(__file__)
,它给出配置文件的目录 (/code/
) 而不管导入配置的脚本在哪里。
具体回答问题,在config文件中定义
path1 = os.path.abspath(os.path.join(os.path.join(os.path.join( os.path.dirname(__file__) , '..'), 'data' ), 'data_file1' ) )