Как я могу получить файлы в рамках тестов в Python? - PullRequest
4 голосов
/ 14 мая 2019

У меня следующая структура пакета:

.
├── my_app
│   ├── app.py
│   ├── cli.py
│   ├── db.py
│   └── __init__.py
├── setup.py
├── tests
│   ├── data
│   │   └── foobar.gz
│   ├── test_app.py
│   └── test_database.py
└── tox.ini

В пределах test_app.py я делаю это:

import pkg_resources
path = '../tests/data/foobar.gz'
full_path = pkg_resources.resource_filename(__name__, path)

Теперь я вижу сообщение:

/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py:1145:
  DeprecationWarning: Use of .. or absolute path in a resource path
  is not allowed and will raise exceptions in a future release.
self, resource_name

Что мне делать вместо этого?

(Я мог бы также изменить структуру пакета, но я хотел бы сохранить тестовые данные в тестах - это не нужнодля запуска приложения)

Ответы [ 3 ]

0 голосов
/ 27 мая 2019

Чтобы получить путь относительно вашего каталога скриптов, попробуйте поработать с самим местоположением скрипта:

import sys
print(sys.argv[0])

Вы можете получить каталог, содержащий скрипт, используя os.path.dirname():

import os
import sys
print(os.path.dirname(sys.argv[0]))

Тогда os.path.join() может помочь создать произвольные пути:

import os
import sys
print(os.path.join(os.path.dirname(sys.argv[0]), "some_subdir"))

HTH!

0 голосов
/ 27 мая 2019

Чтобы получить ресурс теста при передаче имени файла теста на pkg_resources, вы хотите использовать путь из файла с тестами, такими как:

import pkg_resources
path = 'data/foobar.gz'
full_path = pkg_resources.resource_filename(__name__, path)

В pytest я также использую этот шаблон в conftest.py:

@pytest.fixture('session')
def test_data_dir():
    return os.path.join(os.path.dirname(__file__), 'data')

Я могу использовать os.path.join(), чтобы легко получить любые данные испытаний.

0 голосов
/ 14 мая 2019

Попробуйте модуль os

import os.path

source_folder =  os.getcwd()
path = os.path.join(source_folder, 'data/foobar.gz')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...