如何在测试中正确设置相对于运行脚本的路径?

zez*_*llo 4 python testing relative-path pytest python-3.x

为了设置一些路径来访问我的应用程序的子目录(比如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]
Run Code Online (Sandbox Code Playgroud)

然后,例如访问data/:

datadir = rootdir + "data/"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

The*_*ler 6

所以通常要做的事情是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_resourcesAPI来访问它.