У меня есть скрипт Python, который делает некоторую очистку веб-страниц, а затем открывает и сбрасывает проанализированные данные в файл JSON в том же каталоге. Все работает, когда скрипт запускается вручную через CLI, но данные не записываются в файл JSON, при запуске из пакетного файла, запускаемого планировщиком задач.
Мне удалось показать, что все данные существуют в скрипте Python при запуске через пакетный файл. Почему-то не запускается только часть функции, которая работает с файлом JSON.
Скрипт Python:
# Packages used:
import requests
from bs4 import BeautifulSoup
import smtplib
import time
from win10toast import ToastNotifier
import json
# Web Scraping...
my_json = {}
def function1():
# Web scraping for data...
json_function(data)
# Below is the function that is not functioning
def json_function(data):
my_json[time.strftime("%Y-%m-%d %H:%M")] = f"{data}"
with open ('json_file.json') as my_dict:
info = json.load(my_dict)
info.update(my_json)
with open('json_file.json','w') as my_dict:
json.dump(info,my_dict)
# A few other functions that work regardless...
# Call function
function1()
Пакетный файл:
"C:\Users\...pythonw.exe" "C:\Users...script.pyw"
JSON-файл:
{"Key":"Value"}
Каждый файл находится в одном каталоге.
При запуске из CLI происходит ожидаемый результат — ключ-значение добавляется в файл JSON. При автоматическом запуске (через пакет и планировщик задач) видимых ошибок нет, и весь скрипт, за исключением json_function, работает как положено.
@PRMoureu Спасибо. Кажется, это решило это. Не могли бы вы объяснить, почему?
речь идет о текущем рабочем каталоге, используйте import os;print(os.getcwd()), чтобы узнать, почему вы не можете получить доступ к файлу, если запускаете скрипт из другого каталога
См. Что необходимо учитывать при выполнении пакетного файла в качестве запланированного задания? Вы забыли настроить в свойствах запланированного задания папку Начинать (текущий каталог), и по этой причине текущий каталог устанавливается в %SystemRoot%\System32 при запуске запланированного задания. Кстати: пакетный файл вообще не нужен. Просто настройте в запланированной задаче запуск "C:\Users\...pythonw.exe" с аргументом "C:\Users...script.pyw", за исключением того, что пакетный файл содержит больше этой строки, что невозможно сделать с помощью самого скрипта Python.
См. также Как мне получить путь к скрипту Python, в котором я работаю? и В Python, как мне получить путь и имя файла, который в данный момент выполняется? Хорошая закодированная программа или сценарий, который обращается к файлам в папке программы/сценария, сначала определяет путь к папке запущенной программы/сценария, объединяет этот путь с именами файлов, которые нужно открыть/сохранить в папке программы/сценария, и используйте динамически созданные полные имена файлов, а не просто имя файла без пути.

Спасибо @PRMoureu за ответ и @Mofi за подробное объяснение.
Ответ заключается в том, чтобы убедиться, что все файлы, на которые ссылаются, имеют полный путь:
def json_function(data):
my_json[time.strftime("%Y-%m-%d %H:%M")] = f"{data}"
with open ('C:/.../json_file.json') as my_dict:
info = json.load(my_dict)
info.update(my_json)
with open('C:/.../json_file.json','w') as my_dict:
json.dump(info,my_dict)
Или направьте планировщик заданий в рабочий каталог, чтобы избежать запуска пакета в корневом каталоге по умолчанию.
попробуйте передать полный путь к файлу json при его открытии