如何在 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 个参数:Level 和 JobInfo
我想使用 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 返回字典的 元组 (其中每个字典包含一个 [MS.Docs]: JOB_INFO_1 structure - 对于
如何将来自 EnumJobs 的信息传递给 SetJob:
JobID 参数(您询问的)是
job_info["JobId"]
(检查上一个项目符号)还要注意接下来的 2 个参数:Level 和 JobInfo