2017-01-06 7 views
3

現在、私はPythonでプリンタでいくつかのテストを行っていますが、私がしようとしているのは利用可能なすべてのプリンタをリストすることです。OS XのPythonを使用して利用可能なすべてのプリンタを取得

現在、Connectionクラスのいくつかの有用なAPIを公開しているPyCupsライブラリを使用しています。これらの中でも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を使用せずに行うことはできないと確信しています。

docsへの提案やご意見はありがとうございます。おかげ

私はあなたがターミナルコマンドlpstatman for OSX)を使用して、類似したクエリを実行することができますPythonの3

+1

downvotesを動かす。 – Sid

+1

OSXにはCUPSが同梱されています。私は 'pycups 'を使ってそれを突き止めるのが理にかなっていると思います。 'cffi'を使って得ることができる"コア印刷レイヤー "もあります。https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Printing/osxp_aboutprinting/osxp_aboutprt.html –

+1

あなたの全体的な目標は何ですか? ?アプリケーションで配布する必要がある余分なパッケージの数を最小限に抑えようとしていますか(できるだけ「ピジョンソニック」のままです)。あるいは、OS X上でプリンタを反復する最も「ピジョンソニック」な方法を探しているだけですか? – Richard

答えて

1

PythonのCライブラリを標準モジュールのみで使用することは可能です。参考文献:CUPS API,ctypes

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) 

​​を使用している場合は特に注意してください、エラーのほとんどは、セグメンテーションフォールトを生成します:CUPS構造を翻訳し、​​構文に呼び出して、我々は標準OS XのPythonとPython 3の両方で動作するコードを取得します。

+0

私はCUPSを使用するよりも、私が提供したスニペットを使用することができます – Sid

+2

どのようなタスクですか、どのライブラリをまったく避けることを意味しましたか? CUPSはAppleによって開発され、他のすべてのインターフェイスは(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Printing/osxp_flexible/osxp_flexible.html)存在します。 – void

+0

私はライブラリをまったく避けることを意味し、OSXとWinの両方で動作するものかもしれません。 – Sid

1

使用しています。 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) 
+0

ええ、私も同じことを考えましたが、どちらが「Pythonic」の方法であるか疑問に思っていました。 – Sid

+2

'lpstat -a'はプリンタ名と受け入れ状態のみを表示します。出力は標準形式であることが保証されていないので、解析コードが異なるOS Xバージョンで破損する可能性があります。 – void

+0

@void goot point – Sid

関連する問題