Как назначить уже запущенный процесс (например, Excel) объекту Python (PyWin32), чтобы закрыть его - PullRequest
0 голосов
/ 13 апреля 2020

Итак, я пытаюсь сделать следующее:

  1. Открыть книгу Excel и ввести некоторые значения в ячейки
  2. Прочитать файл Excel, используя Pandas, который покрывает его в DataFrame
  3. Выполните некоторые операции над DataFrame
  4. Закройте книгу (я хотел бы автоматизировать этот шаг, Pandas не может записать вывод, когда файл Excel все еще открыт) * ​​1010 *
  5. Вывод результатов в другую рабочую таблицу, но ту же рабочую книгу
  6. Повторно откройте рабочую книгу Excel, чтобы проверить результаты

В частности, шаги 4 - это то, где у меня есть некоторые проблемы, где я должен закрыть Excel или я получу ошибку (PermissionError: [Errno 13]). Я знаю, как вы можете использовать PyWin32 для открытия приложения Excel и делать что угодно, но есть ли способ назначить уже открытую книгу Excel (ранее открытую из проводника файлов) объекту PyWin32?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Извините, кажется, я нашел решение для того, что хотел, но хорошо, я думаю, что я, возможно, плохо описал мою проблему в первую очередь здесь. По сути, я просто хотел, чтобы код закрыл уже открытое приложение Excel (возможно, следовало бы сказать это вместо Workbook) и записать в него некоторые результаты, а затем снова открыть его.

import os, sys
import tempfile
import win32com.client

from pathlib import Path
filename = Path.cwd() / "ExcelFile.xlsx"

# Obtains the opened Excel instance
wb1 = win32com.client.GetObject(str(filename))

# Closes Excel
wb1.Application.Quit()

# Do whatever here like writing output in that Excel Workbook

# Reopen that Excel file
os.startfile(filename)

Найдено это быть полезным. Еще раз прошу прощения за вводящее в заблуждение описание.

0 голосов
/ 13 апреля 2020

Вы можете использовать библиотеку psutil .

Вы должны найти запущенный процесс в дереве вызовов и уничтожить его.

import os
import signal
import psutil

def kill_proc_tree(pid, sig=signal.SIGTERM, include_parent=True,
                   timeout=None, on_terminate=None):
    """Kill a process tree (including grandchildren) with signal
    "sig" and return a (gone, still_alive) tuple.
    "on_terminate", if specified, is a callabck function which is
    called as soon as a child terminates.
    """
    assert pid != os.getpid(), "won't kill myself"
    parent = psutil.Process(pid)
    children = parent.children(recursive=True)
    if include_parent:
        children.append(parent)
    for p in children:
        p.send_signal(sig)
    gone, alive = psutil.wait_procs(children, timeout=timeout,
                                    callback=on_terminate)
    return (gone, alive)

См. документация .

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