Тестовые скрипты PyPa setup.py

Я пытаюсь следовать советам и структуре, написанным в документации по Python. В функции настройки вы можете указать зависимости для тестов с tests_require, И вы можете запустить сценарии при установке, просто указав scripts, Но могу ли я иметь скрипт, который запускается только в случае установки для тестирования?


редактировать: важные части моего setup.py

from setuptools import setup
# To use a consistent encoding
from codecs import open
from os import path
import subprocess
from setuptools import setup
from setuptools.command.test import test

class setupTestRequirements(test, object):
    def run_script(self):
        cmd = ['bash', 'bin/test_dnf_requirements.sh']
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
        ret = p.communicate()
        print(ret[0])

    def run(self):
        self.run_script()
        super(setupTestRequirements, self).run()

...
setup(
    ...
    scripts=['bin/functional_dnf_requirements.sh'],
    install_requires=['jira', 'PyYAML'],
    tests_require=['flake8', 'autopep8', 'mock'],

    cmdclass={'test': setupTestRequirements}
)

1 ответ

Решение

Это не означает, что файлы в scripts будет выполнен при установке пакета. Ключевое слово scripts используется для маркировки файлов Python в вашем пакете, которые предназначены для запуска в качестве автономных программ после установки пакета (возможно, название немного вводит в заблуждение). Пример: у вас есть файл spam с содержанием:

#!/usr/bin/env python

if __name__ == '__main__':
    print('eggs!')

Если вы пометите этот файл как скрипт, добавив его в scripts в вашем setup.py:

from setuptools import setup

setup(
    ...
    scripts=['spam'],
)

после установки пакета вы можете запустить spam как отдельная программа в вашем терминале:

$ spam
eggs!

Прочтите это руководство для получения дополнительной информации о сценариях командной строки.


Теперь, если вы хотите выполнить пользовательский код при тестировании, вы должны переопределить значение по умолчанию test команда. В вашем setup.py:

from setuptools.command.test import test

class MyCustomTest(test):

    def run(self):
        print('>>>> this is my custom test command <<<<')
        super().run()

setup(
    ...
    cmdclass={'test': MyCustomTest}
)

Теперь вы заметите дополнительный отпечаток при запуске тестов:

$ python setup.py test
running test
>>>> this is my custom test command <<<<
running egg_info
...
running build_ext

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Редактировать: если вы хотите запустить собственный скрипт bash перед выполнением тестов, адаптируйте MyCustomTest.run() метод. Пример скрипта script.sh:

#!/usr/bin/env bash
echo -n ">>> this is my custom bash script <<<"

адаптация MyCustomTest класс в setup.py:

import subprocess
from setuptools import setup
from setuptools.command.test import test


class MyCustomTest(test):

    def run_some_script(self):
        cmd = ['bash', 'script.sh']
        # python3.5 and above
        # ret = subprocess.run(cmd, stdout=subprocess.PIPE, universal_newlines=True)
        # print(ret.stdout)

        # old python2 versions
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
        ret = p.communicate()
        print(ret[0])

    def run(self):
        self.run_some_script()
        super().run()

Выход:

$ python setup.py test
running test
>>> this is my custom bash script <<<
running egg_info
writing spam.egg-info/PKG-INFO
writing dependency_links to spam.egg-info/dependency_links.txt
writing top-level names to spam.egg-info/top_level.txt
reading manifest file 'spam.egg-info/SOURCES.txt'
writing manifest file 'spam.egg-info/SOURCES.txt'
running build_ext

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Другие вопросы по тегам