使用Python获取OS X中所有可用的打印机

时间:2017-01-06 21:13:41

标签: python python-3.x printing printers

目前我正在使用Python中的打印机进行一些测试,我要做的是列出所有可用的打印机。

现在我正在使用PyCups库,它在Connection类中公开了几个有用的API。其中还有getPrinters()

这是我使用和运作的片段:

>>> import cups
>>> conn = cups.Connection ()
>>> printers = conn.getPrinters ()
>>> for printer in printers:
...     print printer, printers[printer]["device-uri"]
Brother_MFC_1910W_series
Photosmart_6520_series

我想知道是否有任何方法可以在不使用任何外部库的情况下编写上述代码。我很确定不能在不使用C的情况下完成。

我们非常感谢您对文档的任何建议或参考。感谢

我正在使用Python 3

2 个答案:

答案 0 :(得分:2)

可以使用Python中的C库和标准模块。参考文献:CUPS APIctypes。将CUPS结构和调用转换为ctypes语法,我们得到一个在标准OS X Python和Python 3下都能运行的代码:

from __future__ import print_function

from ctypes import *


class cups_option_t(Structure):
    _fields_ = [
        ('name', c_char_p),
        ('value', c_char_p)
    ]


class cups_dest_t(Structure):
    _fields_ = [
        ('name', c_char_p),
        ('instance', c_char_p),
        ('is_default', c_int),
        ('num_options', c_int),
        ('cups_option_t', POINTER(cups_option_t))
    ]


cups_lib = cdll.LoadLibrary('/usr/lib/libcups.dylib')


if __name__ == '__main__':
    dests = cups_dest_t()
    dests_p = pointer(dests)    
    num_dests = cups_lib.cupsGetDests(byref(dests_p))    
    for i in range(num_dests):
        dest = dests_p[i]
        print(dest.is_default, dest.name)
        for j in range(dest.num_options):
            option = dest.cups_option_t[j]
            print('', option.name, option.value, sep='\t')    
    cups_lib.cupsFreeDests(num_dests, dests_p)

使用ctypes时要特别小心,大多数错误都会产生分段错误。

答案 1 :(得分:1)

您可以使用终端命令lpstatman for OSX)执行类似的查询。 Python的内置subprocess模块允许您运行该命令并存储输出。某些文本解析应提供打印机名称。

from subprocess import Popen, PIPE

# "lpstat -a" prints info on printers that can accept print requests
p = Popen(['lpstat', '-a'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, errors = p.communicate()

lines = output.split('\n')
# check before you implement this parsing
printers = map(lambda x: x.split(' ')[0], lines)