Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 14, 2021 13:08:16

Markoh
Зарегистрирован: 2021-06-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение приложений через win32com.client.Dispatch. Как отключить автоматическую загрузку?

Прошу помощи. Как отключить автоматическую загрузку приложения при подключении к его com модели? То есть подключаться только если приложение открыто пользователем. В коде ниже поведение автокада и экселя разное, хотя код идентичный. Если эксель не запущен, то срабатывает условие инициализирующее ошибку, а если Автокад не запущен, то он сам запускается и условие не срабатывает. Почему?

import win32com.client

appAutocad = win32com.client.Dispatch(“AutoCAD.Application”)
appExcel = win32com.client.Dispatch(“Excel.Application”)

wb = appExcel.ActiveWorkbook
aDoc = appAutocad.ActiveDocument

if wb == None: err = int('Инициализирую ошибку')
if aDoc == None: err = int('Инициализирую ошибку')

Отредактировано Markoh (Июнь 14, 2021 13:20:46)

Офлайн

#2 Июнь 14, 2021 14:09:33

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Подключение приложений через win32com.client.Dispatch. Как отключить автоматическую загрузку?

Markoh, А с чего вы взяли что когда вы делаете appExcel = win32com.client.Dispatch(“Excel.Application”) оно ексель не запускает? можете посмотреть в диспетчере задач и убедиться что это не так. Просто пока вы не сделаете appExcel.Workbooks.Open(…) appExcel.ActiveWorkbook будет равно None
При отсутвии автокада, предположу что автокад всего навсего сразу создает пустой NewDocument, а не ждет пока ктото чтото откроет, поэтому appAutocad.ActiveDocument и возвращает обьект, а не None.
Хотите проверять если приложение открыто пользователем, так и проверяйте через win32api или psutil, или еще как.
ЗЫ: вызывать исключение таким вот макаром err = int('Инициализирую ошибку') моветон, в пайтон для этого предусмотрена инструкция raise https://docs.python.org/3/tutorial/errors.html#raising-exceptions



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 14, 2021 14:38:03)

Офлайн

#3 Июнь 14, 2021 15:59:06

Markoh
Зарегистрирован: 2021-06-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение приложений через win32com.client.Dispatch. Как отключить автоматическую загрузку?

PEHDOM
PEHDOM, спасибо, что откликнулись. Про моветон - работаю над собой :-). К сути. Эксель реально не загружается, в диспетчере отсутствует. “Хотите проверять если приложение открыто пользователем, так и проверяйте через win32api или psutil”, например так:
appAutocad = win32com.client.GetActiveObject(“AutoCAD.Application”) ?

Офлайн

#4 Июнь 14, 2021 18:14:56

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Подключение приложений через win32com.client.Dispatch. Как отключить автоматическую загрузку?

del



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 14, 2021 21:06:50)

Офлайн

#5 Июнь 14, 2021 21:06:28

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Подключение приложений через win32com.client.Dispatch. Как отключить автоматическую загрузку?

Markoh
Эксель реально не загружается, в диспетчере отсутствует.
Хмм не может быть, после того как вы делаете
win32com.client.Dispatch(“Excel.Application”) в диспетчере задач появляется ексель… проверено не один раз.


Markoh
например так:
например так: https://stackoverflow.com/questions/550653/cross-platform-way-to-get-pids-by-process-name-in-python



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 14, 2021 21:07:06)

Прикреплённый файлы:
attachment test2.png (159,1 KБ)

Офлайн

#6 Июнь 15, 2021 00:14:17

Markoh
Зарегистрирован: 2021-06-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение приложений через win32com.client.Dispatch. Как отключить автоматическую загрузку?

У меня excell(64) из office2010. Не в этом ли дело?. Ну, не суть. Сделал код с win32com.client.GetActiveObject(“AutoCAD.Application”) - все работает как надо. Спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version