Windows10下Python调用exe打印异常问题求助
Windows 10下Python脚本被外部程序调用时无法打印的解决方案
问题背景
在Windows 10环境中,开发了Python脚本生成PDF标签后,通过Ghostscript(gswin32c.exe)和GSPrint实现自动打印。手动运行.pyw脚本时可正常生成并打印,但通过ERP等外部软件调用时,仅能生成标签,打印操作无响应。拆分脚本直接调用print_label.pyw问题依旧。
核心原因分析
外部程序调用脚本时,与手动运行存在工作目录差异、权限限制、环境变量缺失等关键区别,导致打印流程中断。
具体解决步骤
1. 修正文件路径,避免工作目录问题
外部程序调用脚本时,默认工作目录通常不是脚本所在路径,导致.\label.pdf无法正确定位文件。改用脚本绝对路径构造文件路径:
import os # 获取脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) nombre_archivo = "label.pdf" ruta_archivo = os.path.join(script_dir, nombre_archivo)
2. 确保脚本拥有打印机访问权限
ERP等程序常以系统服务或低权限用户身份运行,可能没有打印机操作权限:
- 找到Python解释器(pythonw.exe),右键→属性→兼容性,勾选「以管理员身份运行此程序」;
- 若ERP支持,配置调用脚本时以管理员权限启动。
3. 修复Ghostscript的打印机调用逻辑
- 验证打印机名称准确性:打印机名称必须与Windows设备管理器中完全一致(含大小写、空格),可用以下代码枚举所有打印机:
import win32print printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL) for printer in printers: print(printer[2]) # 输出打印机全名 - 改用GSPRINT直接调用:代码中已定义
GSPRINT_PATH但未使用,替换Ghostscript调用为更稳定的GSPRINT命令:comando = [GSPRINT_PATH, "-printer", nombre_impresora, ruta_archivo] # 添加shell=True确保外部程序能正确解析命令 subprocess.run(comando, check=True, shell=True)
4. 补充环境变量,确保Ghostscript可被找到
外部程序的环境变量可能未包含Ghostscript路径,调用时显式传入完整环境:
import os env = os.environ.copy() # 将Ghostscript所在目录添加到PATH env["PATH"] += os.pathsep + os.path.dirname(GHOSTSCRIPT_PATH) subprocess.run(comando, env=env, capture_output=True)
5. 移除无效的Win32打印代码
代码中后半部分尝试用win32ui.CreateBitmap()加载PDF文件,该方法仅支持BMP/ICO等图像格式,无法处理PDF,属于无效代码且可能引发异常中断流程。直接删除以下代码块:
default_printer = win32print.GetDefaultPrinter() hDC = win32ui.CreateDC() hDC.CreatePrinterDC(default_printer) hDC.StartDoc("Etiqueta") hDC.StartPage() rect = (0, 0, int(hDC.GetDeviceCaps(win32con.PHYSICALWIDTH)), int(hDC.GetDeviceCaps(win32con.PHYSICALHEIGHT))) image = win32ui.CreateBitmap() image.LoadFile(ruta_archivo) hDC.StretchBlt(rect, image, (0, 0, image.GetWidth(), image.GetHeight()), win32con.SRCCOPY) hDC.EndPage() hDC.EndDoc()
6. 添加日志排查问题
在subprocess调用中捕获输出,生成日志文件便于定位错误:
result = subprocess.run(comando, capture_output=True, text=True) log_path = os.path.join(script_dir, "print_debug.log") with open(log_path, "w", encoding="utf-8") as f: f.write(f"返回码: {result.returncode}\n") f.write(f"标准输出:\n{result.stdout}\n") f.write(f"错误输出:\n{result.stderr}\n")
对比手动运行和ERP调用后的日志,可快速定位是文件找不到、打印机不存在还是权限不足等问题。
内容的提问来源于stack exchange,提问作者jadabeau
相关产品推荐
相关产品推荐

