【发布时间】:2015-09-25 16:37:05
【问题描述】:
我正在开发一种用于数据输入的工具,它基本上需要一个报告 ID 号,打开一个 PDF 到该报告的该页面,允许您输入信息然后保存它。
我对在 python 中实例化新进程完全陌生;这是我第一次真正尝试这样做。所以基本上,我有一个相关的功能:
def get_report(id):
path = report_path(id)
if not path:
raise NameError
page = get_page(path, id)
proc = subprocess.Popen(["C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe", "/A", "page={}".format(page),
path])
为了在 Adobe Acrobat 中打开报表并能够在报表仍处于打开状态时输入信息,我决定必须使用 multiprocessing。所以,结果,在程序的主循环中,它遍历数据并获取报告 ID,我有这个:
for row in rows:
print 'Opening report for {}'.format(ID)
arg = ID
proc = Process(target=get_report, args=(arg,))
proc.start()
row[1] = raw_input('Enter the desired value: ')
rows.updateRow(row)
while proc.is_alive():
pass
这样,可以在程序不挂在subprocess.Popen() 命令上的情况下输入数据。但是,如果它只是继续下一条记录而不关闭弹出的 Acrobat 窗口,那么它实际上不会打开下一个报表。因此while proc.is_alive():,因为它提供了一个手动关闭窗口的机会。我希望喜欢在按下“enter”并输入值后立即终止该进程,这样它就会继续并只需更少的工作即可打开下一个报告。我尝试了几种不同的方法,通过pid 使用os.kill() 杀死进程的方法;我尝试杀死子进程,杀死进程本身,杀死它们,还尝试使用subprocess.call() 而不是Popen() 看看它是否有所作为。
没有。
我在这里缺少什么?如何杀死进程并关闭它打开的窗口?这甚至可能吗?就像我说的,我对 python 中的进程只有大约 0 的经验。如果我做错了什么,请告诉我!
提前致谢。
【问题讨论】:
-
你试过 sys.exit(0) 吗?
-
不,我没有——我想我误解了;我以为它也会退出主程序?我只想关闭作为主进程的子进程生成的窗口/进程。它会这样做吗?
-
我想我误解了。您要关闭 Adobe Reader 进程吗?
-
是的,对不起,如果我的帖子有点不清楚。我想结束进程并关闭它所在的 adobe 阅读器窗口,同时让 python 程序(正在处理数据并打开报告)本身运行。
-
你试过proc.terminate()了吗?
标签: python windows multiprocessing subprocess kill-process