如何在 win32print 中使用 SetJob?

How can I use SetJob in win32print?

我想使用 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)

从您的代码开始,我设法创建了一个小脚本,可以删除任何(本地)打印机上的任何打印作业(我已经测试过它 有效 ) .

这是(我运行它与Python 3.5):

code00.py:

#!/usr/bin/env python

import sys
import win32print as wprn


def main(*argv):
    enum_flags = wprn.PRINTER_ENUM_LOCAL #| wprn.PRINTER_ENUM_SHARED
    printer_name = None
    printer_info_level = 1
    for printer_info in wprn.EnumPrinters(enum_flags, printer_name, printer_info_level):
        name = printer_info[2]
        #print(printer_info)
        printer_handle = wprn.OpenPrinter(name)
        job_info_level = 1
        job_info_tuple = wprn.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))
            wprn.SetJob(printer_handle, job_info["JobId"], job_info_level, job_info, wprn.JOB_CONTROL_DELETE)
        wprn.ClosePrinter(printer_handle)


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.")
    sys.exit(rc)

备注:

  • 我在评论中所说的(关于迭代打印机)仍然有效,但我想这超出了这个问题的范围

  • 我对脚本做了一点改进:

    • 给变量起(更多)有意义的名字

    • 使用变量而不是纯数字来提高代码的可读性

    • 其他小修正

    • 可能,它可以使用一些异常处理

  • 脚本的秘密包括:

    • EnumJobs 返回字典的 元组 (其中每个字典包含一个 [MS.Docs]: JOB_INFO_1 structure - 对于 job_info_level = 1) ,或者(显然)一个空元组,如果打印机没有排队的作业
  • 如何将来自 EnumJobs 的信息传递给 SetJob:

    • JobID 参数(您询问的)是 job_info["JobId"](检查上一个项目符号)

    • 还要注意接下来的 2 个参数:LevelJobInfo