ValueError: недопустимый литерал для int() с базой 10: «30,0» при запуске unittest

Я пытаюсь запустить тест, который ранее работал, но внезапно перестал работать, но теперь я, кажется, получаю сообщение об ошибке во всех моих тестах, например.

from httmock import HTTMock
from unittest import TestCase
from unittest.mock import patch, call, mock_open, MagicMock, Mock, ANY

import os.path
import os


from src.operators import InjestDictDescriptionOperator
from airflow.hooks.base_hook import BaseHook
from airflow.hooks.postgres_hook import PostgresHook
from airflow.hooks.S3_hook import S3Hook

class TestInjestDictDescriptionOperator(TestCase):
    def setUp(self):
        # hook patches
        self.open_file_mock = patch('builtins.open').start()
        self.os_path_isdir = patch.object(os.path, 'isdir').start()
        self.os_makedirs = patch.object(os, 'makedirs').start()
        self.open_file_write_mock = self.open_file_mock.return_value.__enter__.return_value.write


        # prepare the target
        self.target = InjestDictDescriptionOperator(
            task_id='InjestDictDescriptionOperatorTest',
            sql=None,
            postgres_conn_id='test',
            aws_conn_id='s3-conn-1',
            s3_bucket_name=‘data’,
            output_path='output/path/1')

    def tearDown(self):
        patch.stopall()

    def testTmpFolderCreationIfItDoesntExist(self):
        self.os_path_isdir.return_value = False
        self.target.execute(None)
        self.os_makedirs.assert_called_with('/tmp/')

    def testTmpFolderNotCreatedIfItExists(self):
        self.os_path_isdir.return_value = True
        self.target.execute(None)
        self.os_makedirs.assert_not_called()

    def testTmpFileCreation(self):
        self.target.execute(None)
        self.open_file_mock.assert_called_with(
            '/tmp/modelling/temp.txt',
            'w+',
            encoding='utf-8')

    def testTmpFileDataDump(self):
        self.target.execute(None)
        self.open_file_write_mock.assert_has_calls(
            [ call(f"{doc['name']}\n") for doc in self.dummy_data ]
            , any_order=False)

Детали трассировки проблемы:

ests/operators/modelling/language/test_injest_dict_description_operator.py:9: in <module>
    from src.operators.modelling.language import InjestDictDescriptionOperator
src/operators/modelling/language/__init__.py:1: in <module>
    from .injest_onboarded_commands_operator import Operator as InjestOnboardedCommandsOperator
src/operators/modelling/language/injest_onboarded_commands_operator.py:9: in <module>
    from airflow.models import BaseOperator
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/__init__.py:50: in <module>
    from airflow.models import DAG  # noqa: E402
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/__init__.py:21: in <module>
    from airflow.models.baseoperator import BaseOperator, BaseOperatorLink  # noqa: F401
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/baseoperator.py:43: in <module>
    from airflow.models.dag import DAG
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/dag.py:52: in <module>
    from airflow.models.dagbag import DagBag
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/dagbag.py:50: in <module>
    class DagBag(BaseDagBag, LoggingMixin):
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/dagbag.py:80: in DagBag
    DAGBAG_IMPORT_TIMEOUT = conf.getint('core', 'DAGBAG_IMPORT_TIMEOUT')
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/configuration.py:414: in getint
    return int(self.get(section, key, **kwargs))
E   ValueError: invalid literal for int() with base 10: '30.0'collection failure
tests/operators/modelling/language/test_injest_dict_description_operator.py:9: in <module>
    from src.operators.modelling.language import InjestDictDescriptionOperator
src/operators/modelling/language/__init__.py:1: in <module>
    from .injest_onboarded_commands_operator import Operator as InjestOnboardedCommandsOperator
src/operators/modelling/language/injest_onboarded_commands_operator.py:9: in <module>
    from airflow.models import BaseOperator
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/__init__.py:50: in <module>
    from airflow.models import DAG  # noqa: E402
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/__init__.py:21: in <module>
    from airflow.models.baseoperator import BaseOperator, BaseOperatorLink  # noqa: F401
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/baseoperator.py:43: in <module>
    from airflow.models.dag import DAG
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/dag.py:52: in <module>
    from airflow.models.dagbag import DagBag
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/dagbag.py:50: in <module>
    class DagBag(BaseDagBag, LoggingMixin):
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/models/dagbag.py:80: in DagBag
    DAGBAG_IMPORT_TIMEOUT = conf.getint('core', 'DAGBAG_IMPORT_TIMEOUT')
../../../../.pyenv/versions/3.6.10/lib/python3.6/site-packages/airflow/configuration.py:414: in getint
    return int(self.get(section, key, **kwargs))
E   ValueError: invalid literal for int() with base 10: '30.0'

Единственное, что изменилось, это apache-airflow. Я обновился до последней версии 2.0, но потом понял, что мне нужно будет реорганизовать части моего кода, поэтому я понизил его до более поздней версии.

Это могло быть вызвано установкой pytest 5.4.3.

Sql_Pete_Belfast 21.12.2020 01:18

Похоже, у вас файл конфигурации другой версии. Можете ли вы удалить файл ~/airflow/airflow.cfg?

mik-laj 21.12.2020 03:01

DAGBAG_IMPORT_TIMEOUT был обновлен в файлах конфигурации, чтобы он был плавающим для 2.0, а для 1.10.14 он должен был быть плавающим.

Sql_Pete_Belfast 21.12.2020 10:18
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
15
3
8 905
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

DAGBAG_IMPORT_TIMEOUT был обновлен в файлах конфигурации, чтобы он был плавающим для 2.0, а для 1.10.14 он должен был быть плавающим.

Полностью удалил airflow, включая файлы cfg, и переустановил версию.

Это случилось со мной после того, как я случайно установил Airflow 2, а затем понизил версию до 1.10.12. Решение состояло в том, чтобы удалить ~/airflow после понижения версии и позволить ему воссоздать, так как это всего лишь моя тестовая машина.

Вы, сэр, легенда!

Igor L. 09.03.2021 12:02

Вы можете сделать echo $AIRFLOW_HOME, чтобы выяснить, где находится папка. Тем, кто использует Ubuntu в Windows 10, может быть трудно найти его, поскольку он мог попасть в документы Windows в зависимости от того, как был впервые установлен пакет Airflow.

swimmer 09.04.2021 10:07

Обновите файл airflow.cfg. Найдите переменную dagbag_import_timeout и обновите ее тип значения до целого числа вместо числа с плавающей запятой, от dagbag_import_timeout = 30.0 до dagbag_import_timeout = 30. Это должно работать нормально.

Это должен быть принятый ответ! У меня сработало, но мне нужно было также установить psycopg2 и apache-airflow-providers-postgres (возможно, потому, что у меня уже было несколько дагов, использующих postgres).

Karim Sonbol 12.02.2023 22:13

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