Python сценарий, вызываемый из VBA, вызываемый из Python, не работает - PullRequest
0 голосов
/ 29 мая 2020

Я поддерживаю Excel с макросами, которые загружают некоторые данные из inte rnet. Загрузка выполняется в пределах Python (я назову это Python A), сохраняется промежуточно и снова загружается Excel. Этот поток Python запускается макросом в этом Excel. Поскольку я должен делать это в c раз, я хотел автоматизировать это с помощью другого 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 появляется, но новый файл не загружен. Я не вижу сообщение об ошибке

1 Ответ

0 голосов
/ 29 мая 2020

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

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