在Python包/模块中 - 如何定义文件的相对路径?

时间:2017-08-28 13:14:14

标签: python windows python-3.x path

我正在开发一个在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包/模块中定义相对路径? 是否有其他可能的方法来解决路径问题,以无经验的用户可以理解他们应该做什么?

任何想法都表示赞赏。

1 个答案:

答案 0 :(得分:2)

__file__属性将获取您调用它的模块的绝对文件路径(而不是加载它的文件的工作目录)。这允许您定义两个文件,比如config.paramconfig.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