【问题标题】:How to correctly setup a path relative to running script also in tests?如何在测试中正确设置相对于运行脚本的路径?
【发布时间】:2016-06-02 05:49:12
【问题描述】:

为了设置一些路径来访问我的应用程序的子目录(如locale/),我在settings.py 中使用它:

__process_name = os.path.basename(sys.argv[0])
__abspath = os.path.abspath(sys.argv[0])
__l1 = len(__process_name)
__l2 = len(__abspath)
rootdir = __abspath[:__l2-__l1]

然后,例如访问data/

datadir = rootdir + "data/"

问题是,当我在运行测试时运行此 settings.py(例如 python3 -m py.test),然后 sys.argv[0] 不再匹配 myapp 并且测试脚本无法访问 data/

我想知道如何处理这个,例如:

  • 有没有办法从我的应用和测试套件中获取相同的 rootdir?
  • 或者,我是否应该只为我的应用保留settings.py,并为测试套件提供正确的(硬编码)根目录?
  • 或者在配置文件中定义一个installdir,它将在安装期间设置,然后由我的应用程序(而不是上面的 sn-p)及其测试套件使用?
  • 我也想过用'myappname' 替换sys.argv[0],但是,由于有不同的目录具有相同的名称,因此不确定它是否正确。 (另外,如果在另一个地方有一个安装版本和一个开发版本怎么办:如何区分它们?)

那么,处理这个问题的最佳方法是什么?

【问题讨论】:

  • 您是否尝试过使用os.path.dirname(os.path.abspath(__file__))
  • @TheCompiler 不,没试过。我将不得不真正破解它来处理目录的级别差异,但这绝对可以优雅地解决这个问题!这很聪明!您可以将其添加为答案。

标签: python python-3.x testing relative-path pytest


【解决方案1】:

所以通常的做法是os.path.dirname(os.path.abspath(__file__))

__file__ 是当前模块的路径,os.path.abspath 确保它是绝对的,os.path.dirname 给你它的目录部分。

如果您有一个模块作为包的一部分并且需要例如包中的目录,您可以根据需要使用os.path.join(..., os.pardir),或者如果可能的话,导入包(即它的__init__.py)并执行your_package.__file__

您可能还需要考虑的另一种方法是使用 setuptools 将您的数据指定为包数据,然后使用 pkg_resources API 访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2021-01-18
    • 1970-01-01
    • 2016-07-08
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多