1

我遇到了一个特定的问题。我正在编写 Python 脚本,该脚本使用 VBA API 从 MS Access 数据库 (.mdb) 中读取数据,并使用 tkintertable 模块将其显示在 GUI 表中。

问题是脚本终止后 MSACCESS.exe 进程在进程列表中保持活动状态。

当我评论根窗口的 mainloop() 方法时,问题就消失了。

显式调用 access.quit() 并不能解决问题。更糟糕的是:脚本终止,但 MS Access 进程可见,我看到它的窗口,但无法关闭它,因为它出现得越来越多。

我从代码中删除了所有不必要的行以定位问题:

#!C:\Python343\python
from comtypes.client import CreateObject
from tkinter import *

access = CreateObject('Access.Application')

root = Tk()
root.mainloop() # if I comment this line, everything works
# access.quit() - does not help: MS Access window gets visible and immortal
#

有人能提供任何线索说明为什么会发生这种情况吗?提前感谢您的任何建议。

Python 版本:3.4.3。微软办公室:2013。

4

1 回答 1

0

不幸的是,我无法切换到pypyodbc或其他包,因为脚本很大,不方便重新设计。现在它使用 VBA API(OpenRecordSet、MoveFirst、MoveLast 方法等),但 pypyodbc 不反映此 API AFAIK。

现在我使用一种解决方法(杀死 MSACCESS.EXE 应用程序)。我会把它贴在这里。可能对遇到同样问题的人有用:

def close_by_force(app): # Took this function from https://stackoverflow.com/
    # questions/10221150/cant-close-excel-completely-using-win32com-on-python,  
    # but had to redesign it to be usable to work with COM objects

import win32process
import win32gui
import win32api
import win32con

# Get the window's process id's
hwnd = app.hWndAccessApp()
t, p = win32process.GetWindowThreadProcessId(hwnd)
# Ask window nicely to close
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
# Allow some time for app to close
time.sleep(10) # not really necessary
# If the application didn't close, force close
try:
    #print('pid='+str(p))
    handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p)
    if handle:
        win32api.TerminateProcess(handle, 0)
        win32api.CloseHandle(handle)
except:
    pass

...
access = CreateObject('Access.Application')
DBEngine = access.DBEngine
db = DBEngine.OpenDatabase("C:\<my_db_path>")
.... some code (working with the database) ...
close_by_force(access.Application) # this is the crucial line

正如我在网上发现的那样,这个问题是一个老问题,并且在不同的主题上进行了讨论,但我在任何地方都没有看到确切的解决方案,例如:

http://www.xtremevbtalk.com/showthread.php?t=298607

在 C# 中,我应该如何关闭正在运行的线程(Access DB)?

http://python-list.python.narkive.com/gCMlrB8M/using-excel-with-python

还发现我可以使用 System.Runtime.InteropServices.Marshal.ReleaseComObject(access) 之类的东西,但我找不到任何链接,我可以在哪里获得相关的 Python 包来使用这些类。

--

亲切的问候,

亚历山大。

于 2015-04-23T00:04:49.807 回答