Python修改默认打印机后,win32api.ShellExecute仍用初始打印机打印的问题
问题解决:修改默认打印机后ShellExecute仍使用初始打印机
问题原因
ShellExecute的print动作可能缓存程序启动时的默认打印机配置,系统默认打印机的变更无法被该API即时感知,导致打印任务始终发送到初始默认打印机。此外,循环内重复导入模块、依赖短暂修改默认打印机再恢复的逻辑也存在时序不可靠的问题。
解决方案
直接在打印命令中指定目标打印机,无需修改系统默认打印机,这种方式更高效且能避免时序问题。同时优化代码结构,将模块导入移到函数外部。
修改后的代码示例(推荐)
import win32print import win32api import time def printfile(filename): while True: printername = input("printername: ") try: # 通过/d参数直接指定目标打印机,无需修改系统默认打印机 win32api.ShellExecute( 0, "print", filename, f"/d:{printername}", ".", 0 ) time.sleep(3) # 等待打印任务提交完成 except Exception as err: print(err) printfile('Black.pdf')
备选方案:使用win32print直接处理打印任务
如果ShellExecute方式仍有问题,可尝试用win32print API直接创建打印任务(注意:此方式适合打印机原生支持的文件格式,如文本;打印PDF需额外处理):
import win32print import win32api import time def printfile(filename): while True: printername = input("printername: ") try: hprinter = win32print.OpenPrinter(printername) try: # 初始化打印任务 win32print.StartDocPrinter(hprinter, 1, (filename, None, "RAW")) win32print.StartPagePrinter(hprinter) # 读取文件内容并发送至打印机 with open(filename, "rb") as f: win32print.WritePrinter(hprinter, f.read()) win32print.EndPagePrinter(hprinter) win32print.EndDocPrinter(hprinter) finally: win32print.ClosePrinter(hprinter) time.sleep(2) except Exception as err: print(err) printfile('Black.pdf')
打印PDF补充说明:若打印机不支持直接解析PDF,可借助Adobe Acrobat Reader的命令行打印:
win32api.ShellExecute(0, "open", "AcroRd32.exe", f"/t \"{filename}\" \"{printername}\"", ".", 0)
内容的提问来源于stack exchange,提问作者MASOOD
相关产品推荐
相关产品推荐

