我正在开发一个在Windows上运行的Python工具箱,需要知道几条路径:
/path/to/output
,/path/to/calc/
,/fixed/path/to/server
/path/to/program.exe
其中一些路径是固定的,可以进行硬编码。其中一些根据用户而改变。
目前我使用配置文件config.param
解决了这个问题。该文件必须由每个用户创建。
我选择这样一个配置文件的原因是,没有经验的用户可以简单地从别人那里复制这个文件,并根据他们的系统更改内容。
目录如下所示
Toolbox
|
+-- config.param
|
+-- package
| |
| +-- __init__.py
| |
| +-- path_and_names.py
|
+-- example
|
+-- example.py
|
+ example_sub
|
+-- example_sub.py
对于所有路径变量的内部使用,我使用一个名为PathAndNames
的类。问题现在减少为:此类PathAndNames
需要知道文件config.param
的位置。由于两者都是具有固定相对路径的Python包的一部分,我通过
class PathAndNames:
PATH_TO_CONFIG = os.path.normpath("../config.param")
由于这是一个工具箱,因此用户应该可以使用/where/he/likes
来使用它,例如他的计算文件夹所在的位置。
他需要创建一个PathAndNames
的实例,然后应该知道所有正确的路径。
问题是,../config.param
现在引用/where/he/likes/../config.param
而不是工具箱中的正确路径。
用户目前被迫在工具箱的子文件夹中编写代码,例如与子文件夹example.py
中的Toolbox/example/
类似。
如果该文件夹不在Toolbox
的直接子文件夹中,例如与子文件夹example_sub.py
中的Toolbox/example/example_sub
类似,那么工具箱将无效。在此示例中,../config.param
知道的PathAndNames
的位置为Toolbox/example/config.param
。
有没有办法在Python包/模块中定义相对路径? 是否有其他可能的方法来解决路径问题,以无经验的用户可以理解他们应该做什么?
任何想法都表示赞赏。
答案 0 :(得分:2)
__file__
属性将获取您调用它的模块的绝对文件路径(而不是加载它的文件的工作目录)。这允许您定义两个文件,比如config.param
和config.py
,然后在config.py
中您可以添加如下所示的行:
import os
__here__ = os.path.join(*list(os.path.split(os.path.dirname(__file__)))[:-1])
PATH_TO_CONFIG = os.path.join(__here__, 'config.param')
从用户脚本中,您可以将文件路径设为
from my_module.config import PATH_TO_CONFIG