Скрипт Python, вызванный из VBA, вызванный из Python, не работает

Я поддерживаю Excel с макросом, который загружает некоторые данные из Интернета. Загрузка выполняется в Python (я буду называть это Python A), промежуточно сохраняется и снова загружается в Excel. Этот поток Python запускается макросом в этом Excel. Поскольку я должен делать это в определенное время, я хотел автоматизировать это с помощью другого планировщика Python. Планировщик открывает Ничего особенного, делал это раньше, по крайней мере, я так думал. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что Python A работает неправильно при запуске из Python B. Макрос Excel работает нормально. Я знаю это, потому что некоторые файлы экспортируются, что также делается в макросе.

Что я пробовал до сих пор:

  • Запуск макроса вручную - все в порядке
  • Установка всех путей абсолютными, но это уже было, так что там ничего улучшать не надо.
  • Вызов потока Python B из файла bat. Это работает (?!)
  • Вызов летучей мыши из запланированного потока не работает

Код в VBA:

cmdLine = "python ""path_with_spaces_to_file"" "

lngResult = ShellAndWait(cmdLine, 0, vbNormalFocus, AbandonWait)

Код в Python B для вызова макроса:

import win32com.client
def func():
    filename_excel = r"filename_to_excel_with_spaces.xlsm"
    xl = win32com.client.DispatchEx('Excel.Application')
    xl.Visible = False

    xl.Workbooks.Open(Filename=filename_excel, ReadOnly=1)

    sheet = xl.ActiveWorkbook.Sheets("Sheetname")

    xl.Application.Run("Macroname")
    xl.DisplayAlerts = False
    xl.Application.Quit()

Как я вызываю эту функцию из планировщика:

subprocess.run(["python3_location.bat", "-c", 'from python_B_file import func; func()'],
                stdout=subprocess.PIPE,
                cwd=r"path_to_python_B_file",
                universal_newlines=True,
                timeout=60)

Я вижу всплывающее дополнительное окно cmd, но новый файл не загружается. Я не вижу сообщения об ошибке


person Mathias711    schedule 29.05.2020    source источник
comment
Обратите внимание, я понимаю, что это очень специфическая проблема, но, записывая вопрос, делая его настолько последовательным, насколько это возможно, пытаясь сузить его до MWE, я придумал ответ / проблему. Поскольку я могу представить, что я или кто-то другой из моей компании столкнется с той же проблемой, я все же хотел опубликовать ее. Если у кого-то есть подсказки, как сделать его более общим вопросом или ответом, я все равно хотел бы это услышать :)   -  person Mathias711    schedule 29.05.2020


Ответы (1)


Пробуя разные вещи, я обнаружил, что в обычном пространстве имен команда python относится к установке Python 2.7 по умолчанию, а Python B — 3.7. Код Python A не был совместим с Python 3 (что-то с urllib, что легко решить, чтобы что-то работало в обеих версиях Python). Вызов макроса Excel из Python B каким-то образом изменил пространство имен, а команда ShellAndWait ссылалась на Python 3.7.

person Mathias711    schedule 29.05.2020