Python 可以在Windows中获取打印机名称列表吗?

Python 可以在Windows中获取打印机名称列表吗?,python,windows,Python,Windows,我正在尝试为Windows创建自动打印机安装程序 如果我想获取打印机列表,我将如何在Python中实现这一点?我知道有一种方法可以在命令行上使用VB脚本获取列表,但这给了我不需要的额外信息,而且没有真正好的方法将数据导入Python(我知道) 这样做的原因是获取值并将其放入一个列表中,然后让它们与另一个列表进行检查。“一”列表中的任何内容都将被删除。这确保程序不会安装重复的打印机。您可以使用的win32print.EnumPrinters()(更方便),或者通过ctypes模块调用EnumPri

我正在尝试为Windows创建自动打印机安装程序

如果我想获取打印机列表,我将如何在Python中实现这一点?我知道有一种方法可以在命令行上使用VB脚本获取列表,但这给了我不需要的额外信息,而且没有真正好的方法将数据导入Python(我知道)

这样做的原因是获取值并将其放入一个列表中,然后让它们与另一个列表进行检查。“一”列表中的任何内容都将被删除。这确保程序不会安装重复的打印机。

您可以使用的
win32print.EnumPrinters()
(更方便),或者通过
ctypes
模块调用
EnumPrinters()
API(低依赖性)

这是一个完全工作的
ctypes
版本,没有错误检查

# Use EnumPrintersW to list local printers with their names and descriptions.
# Tested with CPython 2.7.10 and IronPython 2.7.5.

import ctypes
from ctypes.wintypes import BYTE, DWORD, LPCWSTR

winspool = ctypes.WinDLL('winspool.drv')  # for EnumPrintersW
msvcrt = ctypes.cdll.msvcrt  # for malloc, free

# Parameters: modify as you need. See MSDN for detail.
PRINTER_ENUM_LOCAL = 2
Name = None  # ignored for PRINTER_ENUM_LOCAL
Level = 1  # or 2, 4, 5

class PRINTER_INFO_1(ctypes.Structure):
    _fields_ = [
        ("Flags", DWORD),
        ("pDescription", LPCWSTR),
        ("pName", LPCWSTR),
        ("pComment", LPCWSTR),
    ]

# Invoke once with a NULL pointer to get buffer size.
info = ctypes.POINTER(BYTE)()
pcbNeeded = DWORD(0)
pcReturned = DWORD(0)  # the number of PRINTER_INFO_1 structures retrieved
winspool.EnumPrintersW(PRINTER_ENUM_LOCAL, Name, Level, ctypes.byref(info), 0,
        ctypes.byref(pcbNeeded), ctypes.byref(pcReturned))

bufsize = pcbNeeded.value
buffer = msvcrt.malloc(bufsize)
winspool.EnumPrintersW(PRINTER_ENUM_LOCAL, Name, Level, buffer, bufsize,
        ctypes.byref(pcbNeeded), ctypes.byref(pcReturned))
info = ctypes.cast(buffer, ctypes.POINTER(PRINTER_INFO_1))
for i in range(pcReturned.value):
    print info[i].pName, '=>', info[i].pDescription
msvcrt.free(buffer)

您能否提供一个在IronPython 2.7中使用ctypes调用EnumPrinters()的示例?我尝试调用ctypes.EnumPrinters()时出错。谢谢,当然可以。请注意,您不能直接调用
EnumPrinters
,它被有条件地定义为
EnumPrintersA
EnumPrintersW
。我上面编辑的答案使用了
EnumPrintersW
。哇!这真是太神奇了。非常感谢您如此详尽的回答。它工作得很好。如果我可以再问一个问题,我就上路了。现在我有了可用的打印机信息,我还要看一件事,那就是更改ADOBE PDF打印首选项,特别是所有打印都转储到的ADOBE PDF输出文件夹。我在MSDN中注意到PrinterProperties()方法。这能满足我的需要吗?很抱歉,我对打印机API不够熟悉,无法在这里给出确切的答案。虽然API是通用的,但我认为为打印作业指定输出文件夹是不常见的,所以它很可能是Acrobat的东西。您可以与官方联系,或者,如果您足够勇敢,可以监视和调整一些注册表项,如。