You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:13:11