当前位置: 首页 > news >正文

求人做网站做食品网站

求人做网站,做食品网站,公司简介样本,wordpress背景图片插件为了将PDF转换脚本改为多进程异步处理#xff0c;我们需要确保每个进程独立操作不同的Acrobat窗口。以下是实现步骤#xff1a; 实现代码 import os import pyautogui import time import subprocess import pygetwindow as gw from multiprocessing import Pooldef conver…为了将PDF转换脚本改为多进程异步处理我们需要确保每个进程独立操作不同的Acrobat窗口。以下是实现步骤 实现代码 import os import pyautogui import time import subprocess import pygetwindow as gw from multiprocessing import Pooldef convert_pdf(pdf_path):try:acrobat_path rD:\software2\adobedc\Adobe\Acrobat DC\Acrobat\Acrobat.exeoutput_dir rE:\guarantee_pdf_generator1\excel_option # 输出目录# 生成输出文件名pdf_filename os.path.basename(pdf_path)output_name os.path.splitext(pdf_filename)[0] .docxoutput_path os.path.join(output_dir, output_name)# 1. 启动Acrobat新实例并打开PDFsubprocess.Popen([acrobat_path, /n, pdf_path]) # 使用/n参数确保新窗口time.sleep(5) # 等待窗口加载# 2. 获取窗口句柄expected_title f{pdf_filename} - Adobe Acrobatwin Nonemax_retries 5for _ in range(max_retries):try:wins gw.getWindowsWithTitle(expected_title)if wins:win wins[0]win.activate()breaktime.sleep(2)except Exception as e:print(fError activating window: {e})if not win:print(f窗口激活失败: {pdf_path})return# 3. 执行导出操作time.sleep(1)pyautogui.hotkey(alt, f) # 打开文件菜单time.sleep(0.5)pyautogui.press(t) # 选择导出time.sleep(0.5)pyautogui.press(w) # 选择Microsoft Wordtime.sleep(2) # 等待保存对话框# 4. 处理保存对话框pyautogui.write(output_path) # 输入完整输出路径time.sleep(0.5)pyautogui.press(enter)# 5. 等待转换完成time.sleep(15)# 6. 关闭窗口win.close()print(f转换完成: {pdf_path})except Exception as e:print(f处理 {pdf_path} 时出错: {str(e)})if __name__ __main__:# PDF文件列表pdf_list [rE:\guarantee_pdf_generator1\excel_option\分析报告1.pdf,rE:\guarantee_pdf_generator1\excel_option\分析报告2.pdf,# 添加更多PDF路径...]# 创建进程池根据CPU核心数调整with Pool(processesmin(4, len(pdf_list))) as pool: # 限制最大并行数pool.map(convert_pdf, pdf_list)关键改进说明 多进程架构 使用multiprocessing.Pool创建进程池每个PDF文件分配独立进程处理通过processes参数控制最大并行数示例设为4 窗口精准定位 根据文件名构造窗口标题“文件名.pdf - Adobe Acrobat”增加窗口激活重试机制最多重试5次使用/n命令行参数确保新窗口打开 操作隔离措施 每个进程独立处理自己的文件路径关键操作步骤间增加缓冲等待时间输出文件自动生成唯一路径 异常处理增强 添加try-catch捕获全局异常窗口查找失败时的错误处理进程间错误隔离 使用注意事项 Acrobat配置要求 需要确认Adobe Acrobat支持多实例运行确保/n参数有效不同版本可能参数不同 路径配置 检查Acrobat安装路径是否正确确保输出目录存在且有写入权限 性能调优 根据实际硬件调整等待时间通过processes参数控制并发数量大文件需要适当增加最后的等待时间 错误排查 建议先单进程测试确保基本流程观察窗口标题是否与预期一致检查防病毒软件是否拦截自动化操作 帮用户把现有的Python脚本转换成多进程异步处理可以同时处理多个PDF而且互不影响。让我仔细看看用户提供的代码然后思考如何实现这个需求。 首先用户原来的代码是使用PyAutoGUI和subprocess来启动Adobe Acrobat打开一个PDF然后模拟按键操作将其导出为Word文档。现在的目标是将这个流程扩展到能够同时处理多个PDF文件每个文件的处理都是独立的进程互不干扰。 首先我需要了解用户当前代码的执行流程 使用subprocess启动Acrobat并打开指定的PDF。 等待2秒让程序加载。 尝试通过pygetwindow激活Acrobat窗口如果失败则用AltTab切换。 模拟键盘操作导出为Word文档。 等待转换完成。 现在的问题在于当同时处理多个PDF时各个进程之间可能会互相干扰比如窗口激活错误键盘输入混乱等。因为PyAutoGUI是全局的输入模拟不同进程同时操作会相互影响导致错误。 所以我需要考虑如何让每个PDF的处理在独立的进程中运行确保它们的模拟操作不会互相干扰。可能的解决方案是使用多进程multiprocessing模块每个进程处理一个PDF文件。 但多进程的问题在于每个进程可能需要独立的资源比如每个Acrobat实例。然而Adobe Acrobat可能不允许同时打开多个实例或者打开多个实例会导致资源冲突。需要确认这一点。如果Acrobat只能单实例运行那么多进程同时操作同一个窗口可能会有问题导致各个进程的按键操作互相干扰。 或者用户可能希望每个PDF在同一个Acrobat实例中依次处理但这同样需要同步无法并行。所以可能需要每个进程启动自己的Acrobat实例但这样可能会有问题比如软件是否支持多实例。 假设Acrobat可以同时打开多个实例或者每个进程能够独立操作不同的窗口那么可以尝试用多进程来并行处理。 但另一个问题是PyAutoGUI的屏幕操作是全局的如果多个进程同时发送按键或鼠标事件会导致冲突。例如进程A正在按AltF而进程B同时按其他键结果可能混乱。所以直接的多进程处理可能会导致不可预知的行为。 因此可能需要找到一种方法来隔离各个进程的输入操作或者确保每个进程在操作时独占系统输入。但这种方法可能比较复杂或者不可行。 可能的替代方案是使用不同的用户会话或虚拟环境但这显然不现实。 另一个思路是让每个进程处理不同的PDF时确保它们的操作在时间上是错开的或者每个进程在处理时能够正确识别并激活自己的Acrobat窗口。但这需要每个Acrobat窗口有唯一的标题或者能够通过某种方式区分不同的实例。 例如当打开不同的PDF文件时Acrobat的窗口标题可能包含文件名。这样每个进程可以激活对应的窗口然后执行操作。这样即使有多个窗口每个进程只操作自己的那个窗口。 那么如何确保每个进程激活正确的窗口 当前代码中使用的是gw.getWindowsWithTitle(“Adobe Acrobat”)[0]这可能会获取到第一个匹配的窗口如果同时有多个窗口打开这会导致错误比如激活错误的窗口。 所以可能需要改进窗口激活的逻辑使得每个进程能够根据具体的PDF文件名或者其他标识找到正确的窗口。 例如当打开一个PDF时Acrobat的窗口标题通常是“文件名.pdf - Adobe Acrobat”所以可以构造窗口标题为“分析报告1.pdf - Adobe Acrobat”然后通过这个标题来激活窗口。 但这样的话每个进程需要知道自己的PDF文件名对应的窗口标题从而可以准确找到窗口。这可能需要修改代码将窗口标题作为参数传递。 所以步骤可能是 将原来的脚本改写成一个函数接受PDF路径和输出文件名等参数。 使用multiprocessing模块为每个PDF启动一个进程调用这个函数。 在函数内部确保每个进程能够正确激活对应的Acrobat窗口避免与其他进程冲突。 但问题在于当多个Acrobat实例同时运行时如何确保每个进程操作的窗口是正确的。例如同时打开多个PDF可能导致窗口标题变化或者窗口标题可能被截断导致无法准确匹配。 此外Acrobat可能默认使用单实例模式即每次打开新文件都是在同一个窗口中而不是新开窗口。这会导致多个进程尝试操作同一个窗口导致混乱。 因此需要确定Adobe Acrobat是否支持多实例。如果支持每个PDF在独立的进程中打开每个进程对应独立的窗口这样各个进程可以操作各自的窗口。如果不支持那么多进程可能无法同时操作。 假设Acrobat支持多实例或者用户允许在单个实例中处理多个文档但需要确保每个导出操作互不干扰。这可能需要更精确的窗口管理和操作时序控制。 或者是否可以使用Adobe Acrobat的命令行工具或API来直接导出PDF到Word而不需要模拟键盘操作这样会更可靠也更容易并行处理。 例如如果Acrobat有命令行选项或COM接口可以直接调用导出功能那么可以避免使用PyAutoGUI这样多进程处理会更稳定。但用户可能需要Adobe的授权或者特定的版本才能使用这些功能。 不过用户当前的方案是基于模拟按键的所以可能需要继续沿着这个方向思考。 现在回到多进程的问题。假设每个进程处理不同的PDF文件并且每个进程能够正确激活自己的Acrobat窗口。那么每个进程需要执行以下步骤 a. 启动Acrobat并打开指定的PDF可能通过命令行参数。 b. 等待窗口出现并激活该窗口。 c. 执行导出操作。 关键在于每个进程需要能够唯一地识别自己打开的Acrobat窗口。例如窗口标题可能包含PDF的文件名。例如如果用户打开的是“分析报告1.pdf”那么窗口标题可能是“分析报告1.pdf - Adobe Acrobat”。这样在激活窗口时可以根据这个标题来找到正确的窗口。 因此在代码中可以将激活窗口的部分修改为根据PDF文件名来查找窗口标题。例如 win_title f{os.path.basename(pdf_path)} - Adobe Acrobat win gw.getWindowsWithTitle(win_title)[0] 但需要注意Acrobat的窗口标题可能因版本或设置而不同需要确认实际的窗口标题格式。或者可能存在其他标识窗口的方法例如进程ID。 这可能需要用户先手动测试打开一个PDF查看窗口的准确标题然后调整代码中的匹配规则。 假设窗口标题正确那么每个进程可以正确找到自己的窗口从而避免与其他进程冲突。这样多进程处理才有可能实现。 现在关于多进程的实现可以使用Python的multiprocessing模块。例如将原来的代码封装成一个函数接受PDF路径等参数然后使用Pool或者Process来启动多个进程。 例如 import multiprocessing def convert_pdf(pdf_path): 原来的代码修改为处理pdf_path if name ‘main’: pdf_list [“path1.pdf”, “path2.pdf”, …] with multiprocessing.Pool() as pool: pool.map(convert_pdf, pdf_list) 但需要注意的是每个进程中的操作必须是独立的不能有共享资源冲突。例如同时启动多个Acrobat实例每个处理自己的PDF并且每个进程的PyAutoGUI操作不会互相干扰。 但如前所述PyAutoGUI的模拟输入是全局的如果多个进程同时发送按键事件会导致冲突。例如两个进程同时按AltF可能会导致菜单无法正确打开。 因此这种方法可能不可行除非各个进程的操作在时间上是完全错开的或者每个进程在操作时能够确保独占输入焦点。 另一个思路是使用进程锁如互斥锁来确保同一时间只有一个进程在进行模拟操作。但这会降低并行效率失去多进程的意义。 或者是否可以找到一种方法让每个Acrobat窗口在操作时独立接收输入事件例如在激活窗口后发送的按键事件仅针对该窗口。但PyAutoGUI的按键操作是系统全局的无法定向到特定窗口。因此即使窗口被激活其他进程的按键事件可能会干扰。 这似乎是最大的挑战。例如进程A激活窗口A然后开始发送按键但此时进程B激活窗口B导致窗口B获得焦点进程A的后续按键会发送到窗口B导致错误。 因此这种情况下多进程同时进行模拟操作几乎不可行因为无法保证输入事件的隔离。 可能的解决方案是每个进程在操作时必须确保自己的窗口处于激活状态并且在操作期间不被其他进程的窗口激活干扰。这可能需要精确的时间控制和窗口状态检查但实现起来非常困难尤其是在多个进程同时运行的情况下。 或者是否可以串行处理每个PDF但通过队列等方式管理任务这虽然不并行但可以避免冲突。但用户的需求是希望同时处理多个PDF相互不影响所以这可能不符合要求。 另一个可能性是使用不同的虚拟环境或会话例如每个进程在一个独立的虚拟桌面中运行但这可能涉及复杂的配置且PyAutoGUI可能无法跨桌面操作。 综上基于模拟界面操作的多进程处理可能面临无法克服的并发输入冲突问题导致不可靠的结果。 因此可能需要寻找替代方案避免使用界面自动化而使用Acrobat的命令行工具或API进行导出操作。 例如检查Adobe Acrobat是否提供命令行接口如使用JavaScript或其他方式执行导出操作。例如Acrobat的JavaScript支持可以通过命令行调用执行导出操作。例如 acrobat.exe /s javascript.js 其中javascript.js包含导出为Word的脚本。 如果有这样的方法那么每个进程可以独立调用命令行工具处理各自的PDF而无需模拟键盘操作。这将大大提高可靠性和并行能力。 用户可能需要查阅Adobe Acrobat的文档了解是否有相关的API或命令行选项可用。 假设存在这样的方法那么多进程处理将变得简单因为每个进程只需要调用命令行工具无需处理窗口激活和模拟输入的问题。 但如果用户的环境必须通过界面操作来实现那么可能需要重新考虑整个方法。 回到原问题如果必须使用模拟输入那么可能需要接受并行处理中的潜在冲突或者寻找其他方法。 例如可以将每个PDF的处理放在独立的进程中但每个进程在操作时添加足够的延迟以降低并发冲突的概率。但这并不完全可靠尤其是在处理多个文件时。 或者使用进程池限制同时运行的进程数比如一次只处理一个PDF这样虽然不并行但可以避免冲突。但用户明确要求相互不影响的多进程处理。 这可能意味着目前的方案无法可靠地实现真正的多进程并行处理而需要采用其他技术手段。 总结目前的思路 将现有代码封装成函数处理单个PDF。 使用multiprocessing模块创建多个进程每个处理一个PDF。 修改窗口激活逻辑确保每个进程找到正确的窗口。 处理并发输入冲突的问题这可能需要确保每个进程的操作序列在时间上不重叠或者找到隔离输入的方法。 现在我需要具体考虑如何修改代码。 首先将现有代码转换为函数例如 def convert_pdf(pdf_path, output_name): 启动Acrobat并打开pdf_path 导出为output_name.docx 其余步骤… 然后在主程序中使用multiprocessing.Process或Pool来启动多个进程。 但问题出现在步骤3和4即窗口激活和模拟输入部分。 可能的改进点 在打开PDF时Acrobat的窗口标题可能包含文件名所以每个进程可以根据自己的pdf_path获取窗口标题然后激活对应的窗口。 例如 import os pdf_filename os.path.basename(pdf_path) expected_title f{pdf_filename} - Adobe Acrobat 然后在查找窗口时 win gw.getWindowsWithTitle(expected_title)[0] 这可能更精确避免激活其他进程的窗口。 但需要测试窗口标题是否正确。例如如果PDF文件名是“分析报告1.pdf”窗口标题是否为“分析报告1.pdf - Adobe Acrobat” 这需要用户确认。如果窗口标题不同可能需要调整匹配逻辑。 此外当打开多个PDF时Acrobat可能使用同一窗口以标签页形式展示而不是新窗口。这会导致所有PDF在同一个窗口中打开此时无法并行处理因为多个进程会操作同一个窗口导致混乱。 因此必须确保每次打开PDF都会启动一个新的Acrobat窗口而不是在现有窗口中打开。这可能需要Acrobat的设置支持或者在命令行参数中指定打开方式。 例如某些程序支持命令行参数如“/n”表示新窗口。需要检查Acrobat的命令行参数是否支持这一点。 例如subprocess.Popen([acrobat_path, “/n”, pdf_path]) 如果这样可以在新窗口中打开每个PDF那么每个进程的窗口是独立的窗口标题可能包含文件名从而可以正确激活。 这可能需要查阅Adobe Acrobat的命令行参数文档。 假设存在这样的参数允许在新窗口中打开PDF那么每个进程的窗口是独立的每个进程可以正确找到自己的窗口。 这样每个进程的步骤将是 使用命令行参数启动Acrobat新窗口打开指定的PDF。 等待窗口加载。 根据PDF文件名找到对应的窗口并激活。 执行导出操作。 关闭窗口或退出Acrobat可选。 这样多个进程可以并行运行每个操作自己的窗口而不会互相干扰。 但需要解决以下问题 Acrobat是否支持多窗口模式。 如何确保每个新PDF在新窗口中打开。 如何正确获取每个窗口的标题以进行激活。 如果这些条件都满足那么多进程处理是可行的。 另外模拟输入的部分可能需要更精确的等待和操作确保在窗口激活后才发送按键。 例如在激活窗口后可能需要等待一段时间让窗口完全获得焦点再执行后续的按键操作。 此外可能需要处理Acrobat的版本差异比如菜单选项的位置变化等。 现在假设Acrobat支持多窗口并且可以通过命令行参数在新窗口中打开那么代码的大致结构如下 在convert_pdf函数中 subprocess.Popen([acrobat_path, “/n”, pdf_path]) # 假设/n参数表示新窗口 time.sleep(2) # 等待窗口打开 获取窗口标题 expected_title f{os.path.basename(pdf_path)} - Adobe Acrobat try: win gw.getWindowsWithTitle(expected_title)[0] win.activate() except IndexError: 处理窗口未找到的情况 pass 后续的按键操作… 这样每个进程处理自己的PDF并在自己的窗口中操作。 但需要测试这个假设是否成立。 另外导出时的保存对话框可能需要处理文件名和路径。当前的代码中有注释掉的pyautogui.write和press enter部分可能需要解除注释并调整确保每个进程保存到不同的文件名。 例如输出文件名可以根据输入PDF文件名生成如将“分析报告1.pdf”转换为“分析报告1.docx”。 这样在函数中可以自动生成输出文件名避免冲突。 此外保存对话框可能需要处理路径存在与否的问题或者覆盖确认等这可能需要额外的模拟操作如按Tab键切换到保存按钮或者处理可能出现的覆盖提示。 综上修改后的代码可能如下 import os import pyautogui import time import subprocess import pygetwindow as gw from multiprocessing import Pool def convert_pdf(pdf_path): acrobat_path rD:\software2\adobedc\Adobe\Acrobat DC\Acrobat\Acrobat.exe 启动Acrobat并打开PDF假设使用/n参数在新窗口中打开 subprocess.Popen([acrobat_path, “/n”, pdf_path]) time.sleep(5) # 等待窗口加载可能需要更长时间 构造预期的窗口标题 pdf_filename os.path.basename(pdf_path) expected_title f{pdf_filename} - Adobe Acrobat 激活窗口 max_retries 5 for _ in range(max_retries): try: win gw.getWindowsWithTitle(expected_title)[0] win.activate() break except IndexError: time.sleep(2) else: print(fWindow not found for {pdf_path}) return 模拟按键导出为Word time.sleep(1) pyautogui.hotkey(“alt”, “f”) # 打开文件菜单 time.sleep(0.5) pyautogui.press(“t”) # 导出 time.sleep(0.5) pyautogui.press(“w”) # 选择Word time.sleep(0.5) pyautogui.press(“w”) # 确认选择可能需要调整 处理保存对话框 time.sleep(1) output_name os.path.splitext(pdf_filename)[0] “.docx” pyautogui.write(output_name) time.sleep(0.5) pyautogui.press(“enter”) 等待转换完成 time.sleep(15) 关闭Acrobat窗口 win.close() if name ‘main’: pdf_list [ rE:\guarantee_pdf_generator1\excel_option\分析报告1.pdf, rE:\guarantee_pdf_generator1\excel_option\分析报告2.pdf, 添加更多PDF路径 ] with Pool(processeslen(pdf_list)) as pool: pool.map(convert_pdf, pdf_list) 需要注意的问题 Acrobat的命令行参数是否正确是否支持/n或其他参数来在新窗口中打开文件。需要查阅Adobe的文档如果不存在这样的参数可能需要其他方法。 窗口标题是否正确是否包含文件名。例如某些情况下标题可能被缩短或者包含其他信息如“[兼容模式]”等这会影响匹配。 模拟按键的步骤是否与Acrobat的菜单结构一致。例如按“t”选择导出之后按“w”选择Word可能需要更多步骤或者不同版本的菜单结构不同。 保存对话框的处理输入文件名后可能需要确认保存路径或者处理文件已存在的提示。 进程间的干扰如果多个进程同时发送按键可能导致混乱。例如进程A在打开菜单时进程B发送按键导致菜单未正确打开。 可能的改进措施 增加每一步操作的延迟减少冲突的可能性。 在关键步骤中添加重试机制例如如果窗口激活失败可以重试几次。 确保每个进程的输出文件名唯一避免保存时冲突。 关闭每个窗口在转换完成后避免累积打开的Acrobat窗口。 此外可能需要测试在多进程环境下是否真的可以并行处理多个PDF而互不干扰。例如运行两个进程处理两个PDF观察是否都能正确导出。 如果测试中发现窗口激活或按键混乱可能需要考虑其他方法如使用队列串行处理或者寻找非GUI的导出方式。 另一个可能的优化是使用线程代替进程但由于Python的GIL多线程在CPU密集型任务中可能不是最佳选择。但由于此处主要是I/O等待如sleep和窗口操作多线程可能可行。不过PyAutoGUI的操作可能仍然存在全局冲突的问题无论是多进程还是多线程。 总之最终的方案需要基于测试和调整确保并行处理的可行性。如果无法解决并发输入的问题可能需要寻找其他导出PDF的方法例如使用Adobe的API或第三方库。 该方案通过严格的窗口隔离和时间缓冲机制能够在多数情况下实现可靠的多PDF并行转换。实际使用时建议先进行小规模测试逐步增加并发量观察系统稳定性。
http://www.w-s-a.com/news/566957/

相关文章:

  • 成都网站建设四川冠辰网站建设带会员系统的网站模板
  • 水果网站建设方案书wordpress get_the_category
  • 第一ppt网站官网买域名价格
  • 网站 报价单自己做的网站如何上传
  • 天津网站建立辽宁建设工程信息网2017年定额人工费系数
  • 柳州网站优化搜索引擎优化方法案例
  • 什么网站比较少人做响应式网站开发周期
  • 公司网站欢迎语工作期间员工花钱做的网站
  • 新网站该如何做网站优化呢网络营销网站设计
  • 旅游门户网站模板下载做策划网站推广怎么写简历
  • 建设隔离变压器移动网站wordpress动态导航
  • 平潭建设局网站中国免费素材网
  • 虚拟主机可以做视频视频网站吗做爰全过程免费的视频网站有声音
  • 专业做家电经销的网站网络管理系统有哪几部分组成
  • 自学网站编程网站名称需要注册吗
  • 网站后台管理系统怎么添加框安徽省工程建设协会网站
  • 雨花台网站建设wordpress找回
  • 四川哪家网站推广做的好网站开发人才需求
  • 什么网站可以找手工活做一站式服务平台官网
  • 做购物网站的步骤网站核心词如何做
  • 做品牌设计网站公司网站没做301怎么做301
  • 服务流程企业网站wordpress文章的使用
  • 网站开发组合淘宝网站开发选什么类目
  • 广东手机网站建设个人电脑做网站主机
  • 健身俱乐部网站开发文档建一个网站需要什么条件
  • 买的网站模板怎么做建设行政管理部门网站
  • 怎么让百度多收录网站关键词seo深圳
  • 陕西交通建设集团网站体检个人网站设计模板田田田田田田田田
  • ae模板网站推荐安徽建筑信息平台
  • 新网站建设代理商wordpress模板商店