如何在win32print中使用SetJob?

2024-09-28 22:20:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用Python清除或删除打印作业。 但是我怎样才能得到JobID?在

win32print.SetJob(hPrinter, JobID , Level , JobInfo , Command)

我怎么能运行这个代码?在

jobs = []
for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL,None, 1):
    flags, desc, name, comment = p

    pHandle = win32print.OpenPrinter(name)
    print = list(win32print.EnumJobs(pHandle, 0, -1, 1))
    jobs.extend(print)
    SetJob(pHandle, id, 1,JOB_CONTROL_DELETE)
    #where should i get id from?
    win32print.ClosePrinter(pHandle)

Tags: 代码nameidfor作业jobslevelcommand
1条回答
网友
1楼 · 发布于 2024-09-28 22:20:48

从您的代码开始,我成功地创建了一个小脚本,可以删除任何(本地)打印机上的任何打印作业(我测试过它,它的工作原理是)。在

这里是(我用Py35运行它):

import win32print

if __name__ == "__main__":

    printer_info_level = 1

    for printer_info in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, printer_info_level):
        name = printer_info[2]
        #print(printer_info)
        printer_handle = win32print.OpenPrinter(name)
        job_info_level = 1
        job_info_tuple = win32print.EnumJobs(printer_handle, 0, -1, job_info_level)
        #print(type(job_info_tuple), len(job_info_tuple))
        for job_info in job_info_tuple:
            #print("\t", type(job_info), job_info, dir(job_info))
            win32print.SetJob(printer_handle, job_info["JobId"], job_info_level, job_info, win32print.JOB_CONTROL_DELETE)
        win32print.ClosePrinter(printer_handle)

注意事项

  • 我在评论中所说的(关于在打印机上迭代)仍然有效,但我想这超出了这个问题的范围
  • 我对剧本做了一点改进:
    • 给变量起(更多)有意义的名字
    • 使用变量而不是纯数字来提高代码的可读性
    • 其他小更正
    • 可能,它需要一些异常处理
  • 剧本的秘密包括:
    • EnumJobs返回字典元组(其中每个字典包装一个[MSDN]: ^{} structure-for job_info_level = 1),或者(显然)一个空元组,如果打印机没有排队的作业
    • 来自EnumJobs的信息如何传递给SetJob
      • JobID参数(您询问的)是job_info["JobId"](检查前面的项目符号)
      • 还要注意下面两个参数:LevelJobInfo

相关问题 更多 >