我正在为我的工作中的数据输入工具工作,它基本上需要一个报告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次经验。如果我做错了什么,请告诉我!
提前致谢。
答案 0 :(得分:3)
要终止/终止子流程,请致电proc.kill()
/ proc.terminate()
。它可能会让孙子进程运行,请参阅subprocess: deleting child processes in Windows
这样,可以在subprocess.Popen()命令中挂起程序的情况下输入数据。
Popen()
启动命令。它不等待命令完成。有.wait()
方法和便利功能,例如call()
Popen(command).wait()
返回,即相应的外部进程已退出;它并不一定意味着文档在一般情况下已关闭(启动器应用程序已完成但主应用程序可能仍然存在)。即,第一步是删除不必要的multiprocessing.Process
并在主流程中调用Popen()
。
第二步是确保启动一个拥有已打开文档的可执行文件,即,如果它被杀死,相应的文档将不会保持打开状态:AcroRd32.exe
可能已经是这样的程序(测试它:查看call([r'..\AcroRd32.exe', ..])
是否等待文档被关闭),或者它可能有一个启用此类行为的命令行开关。见How do I launch a file in its default program, and then close it when the script finishes?
我尝试杀死子进程,杀死进程本身,杀死它们,并尝试使用subprocess.call()而不是Popen()来查看它是否有所不同。
它没有。
如果kill()
和Popen()
在您的情况下表现相同,那么您要么犯了错误(他们的行为不一样:您应该create a minimal standalone code example with a dummy pdf that demonstrates the problem。使用文字描述:您期望发生什么(一步一步)以及发生的事情)或AcroRd32.exe
只是我上面描述的一个启动器应用程序(它只是打开文档并立即退出而无需等待要关闭文件。)