Действия Github — передача значения из одного скрипта Python в другой

Я нахожусь на ранней стадии изучения Python и столкнулся с проблемой в своем первом проекте.

Для контекста я создаю приложение, которое каждый день отправляет электронное письмо с несколькими предложениями с определенной страницы Википедии. Например, пользователь получит краткое изложение статьи в Википедии для «Нью-Йорк Таймс». Каждый день отправляется электронное письмо по новой теме Википедии. Цель состоит в том, чтобы человек каждый день узнавал о новой теме по электронной почте.

Мой код хорошо работает в моей локальной среде. Но мне нужно было развернуть приложение, чтобы гарантировать ежедневную отправку писем, даже когда мой компьютер был выключен. Для этого я использую Github Actions для ежедневного запуска файлов в запланированное время.

Говоря конкретнее, у меня есть файл Python File1.py, в который предварительно загружено несколько тем из Википедии. Он обрабатывает первые 10 предложений одной из предварительно загруженных тем Википедии с помощью API Википедии и отправляет эти предложения по электронной почте. Затем он обновляет переменную «counter» во втором скрипте Python, File2.py, и завершает работу.

Цель этого — убедиться, что File1.py начинается со следующих десяти предложений темы Википедии. Или перейти к следующей теме, если она уже готова.

При этом я не могу понять, как правильно запустить это с Github. Файл YAML выполняется правильно и запускает File1.py, электронное письмо отправляется по расписанию, но файл File2.py, содержащий переменную счетчика, не обновляется. Это проблема. Если есть лучший способ сделать это без записи в File2.py, дайте мне знать.

Вот часть File1.py


# # Iterates over the sentences
while True:

    for j in range(len(listOfTopics)):
        
        # When a new page starts, set counter to 0 again
        new_value = 0

        with open(r'File2.py', 'w') as f:
            f.write(f"counter = {new_value}")
            f.flush()
            f.close()

        initialPage = wikipedia.page(listOfTopics[j])
        totalContent = initialPage.content
        sentences = sent_tokenize(totalContent) # Breaking down the content into sentences
        
        tenSentences = []

        for i in range(counter, len(totalContent)):

            tenSentences.append(sentences[i])
            if len(tenSentences) == 10:
                server.sendmail('[email protected]', '[email protected]', \
     f"Subject: Topics Email.\n{tenSentences}".encode('utf-8'))
                
                tenSentences = []

                # Iterating through next ten sentences by changing the counter variable
                new_value = counter + 10 

                with open(r'File2.py', 'w') as f:
                    f.write(f"counter = {new_value}")
                    f.flush()
                    f.close()

                sys.exit()

А вот File2.py

counter=10

Я предполагаю, что вы не коммитируете FIle2.py в своих действиях на GitHub, верно?

ravenwing 19.02.2024 01:40

@ravenwing Нет. Придется ли мне зафиксировать File2.py через файл YAML? Я не был уверен, как это сработает. Я пробовал использовать ИИ для ответов, но там упоминалось, что мне следует использовать входы и выходы для чего-то вроде этого.

Manuel Stoilov 19.02.2024 16:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Почему это не работает?

Каждый раз, когда вы запускаете рабочий процесс, он начинается с новой среды. Хотя вы не предоставили общий доступ к файлу рабочего процесса, я предполагаю, что одним из шагов является оформление заказа.

Это означает, что это происходит каждый раз:

  1. Возникло какое-то условие (оно запланировано)
  2. Вы проверяете свой код (с помощью counter=10)
  3. Вы запускаете свой код (сейчас counter=11)
  4. Окружение очищено (вообще нет counter)

Итак, мне в голову приходят два решения:

Решение 1. Простое, но не ортодоксальное.

Это решение — то, что вы ожидаете. Просто зафиксируйте counter=11 после третьего шага. Это изменит ваш счетчик, проверенный на первом шаге. В действиях на github мало ответов, как это сделать

Решение 2. Сложнее и элегантнее.

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

Не пробуйте, но есть бесплатный CountAPI

Почему второй лучше?

  • нет условий гонки. Если вы запустите сценарий дважды быстрее, вы дважды couter=11 зафиксируете его. С помощью атомарного API вы should получаете counter=11 и counter=12.
  • чистый — вы отделяете данные от кода

Коммит сработал. В частности, я добавил строку фиксации в конец моего YAML-файла: - name: зафиксировать изменения в файле run: | git config --global user.name "GitHub Actions" git config --global user.email "[email protected]" git add ./File2.py git commit -m "Обновить файл счетчика" git push origin main Первый раз Я запустил его, но он не сработал, потому что мне пришлось изменить разрешения на действия (Действия > Общие > Разрешения рабочего процесса > Разрешение на чтение и запись). Спасибо за помощь, @ravenwing!

Manuel Stoilov 19.02.2024 20:46

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