Почему скрипт Python, запускаемый через пакетный файл, не записывает в файл json?

У меня есть скрипт 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, работает как положено.

попробуйте передать полный путь к файлу json при его открытии

PRMoureu 24.07.2019 13:17

@PRMoureu Спасибо. Кажется, это решило это. Не могли бы вы объяснить, почему?

Sky020 24.07.2019 13:27

речь идет о текущем рабочем каталоге, используйте import os;print(os.getcwd()), чтобы узнать, почему вы не можете получить доступ к файлу, если запускаете скрипт из другого каталога

PRMoureu 24.07.2019 13:46

См. Что необходимо учитывать при выполнении пакетного файла в качестве запланированного задания? Вы забыли настроить в свойствах запланированного задания папку Начинать (текущий каталог), и по этой причине текущий каталог устанавливается в %SystemRoot%\System32 при запуске запланированного задания. Кстати: пакетный файл вообще не нужен. Просто настройте в запланированной задаче запуск "C:\Users\...pythonw.exe" с аргументом "C:\Users...script.pyw", за исключением того, что пакетный файл содержит больше этой строки, что невозможно сделать с помощью самого скрипта Python.

Mofi 24.07.2019 13:59

См. также Как мне получить путь к скрипту Python, в котором я работаю? и В Python, как мне получить путь и имя файла, который в данный момент выполняется? Хорошая закодированная программа или сценарий, который обращается к файлам в папке программы/сценария, сначала определяет путь к папке запущенной программы/сценария, объединяет этот путь с именами файлов, которые нужно открыть/сохранить в папке программы/сценария, и используйте динамически созданные полные имена файлов, а не просто имя файла без пути.

Mofi 24.07.2019 14:04
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
5
533
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Спасибо @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)

Или направьте планировщик заданий в рабочий каталог, чтобы избежать запуска пакета в корневом каталоге по умолчанию.

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