2017-03-10 5 views
0

私は仕事のために書いたプログラムを改善する方法について数日間探してきました。 Python 3.6を使用しているプログラムは、プリフォーマットされた.docファイルをプリンタに送信するだけですが、プリンタの電源が切れた後にファイルを送信するのを止める方法を見つける方法はありません。紙。印刷されるドキュメントの数はさまざまです。したがって、単純な範囲機能を使用するだけではありません。Python-プリンタとの通信方法

私はwin32printモジュールとpycupsモジュールを調べました(これは私が試してみても問題ありません)。他のアプリからの外部エラーメッセージを取り込む何かが信号モジュールにありますか?理想的には、ファイルを送信する前に、pythonスクリプトがプリントキューの状態を最初に確認できるかどうかです。

win32printモジュールを使用して以下のコードがこれを達成するはずですが、動作しないようです。

import win32print 

p = win32print.OpenPrinter("Canon Inkjet iP1800 series") 

raw = win32print.EnumJobs(p, 0, 999) 

def main(): 
    while len(raw) > 0: 
     #does some function 

    if #receives error from printer: 
     break 

main() 

win32print.ClosePrinter(p) 

答えて

0

サイドノート:しばらくpycups(または任意のカップラッパー)私は、pywin32がベースの勝利であることを言わなければならないいくつかのカップがありますしない限り、そのベースUXのある私が気付いていない勝利のための上記のうちの1つ2つを選んでください。(あなたがいるplatform/archにマッチさせるのが望ましいです)。

私はいくつかの調査を行いました。プリンタが誤った状態になっていないかどうかを確認するために、すべてのプリンタジョブを繰り返す必要はありません。また、0から999までのジョブをループしても、すべてのジョブがチェックされていることを保証するものではないので、上のロジックは正しい(たとえ正しいものであっても)。用紙切れ(win32print.PRINTER_STATUS_PAPER_OUT)と PRINTER_ERROR_STATESでそれらを置く()にエラーとして表示されていないものをコメントアウト:

はここに(私が質問に指定されたよりも多くのエラーを追加する自由を取ったサンプル実装です:

import win32print 

PRINTER_ERROR_STATES = (
    win32print.PRINTER_STATUS_NO_TONER, 
    win32print.PRINTER_STATUS_NOT_AVAILABLE, 
    win32print.PRINTER_STATUS_OFFLINE, 
    win32print.PRINTER_STATUS_OUT_OF_MEMORY, 
    win32print.PRINTER_STATUS_OUTPUT_BIN_FULL, 
    win32print.PRINTER_STATUS_PAGE_PUNT, 
    win32print.PRINTER_STATUS_PAPER_JAM, 
    win32print.PRINTER_STATUS_PAPER_OUT, 
    win32print.PRINTER_STATUS_PAPER_PROBLEM, 
) 


def printer_errorneous_state(printer, error_states=PRINTER_ERROR_STATES): 
    prn_opts = win32print.GetPrinter(printer) 
    status_opts = prn_opts[18] 
    for error_state in error_states: 
     if status_opts & error_state: 
      return error_state 
    return 0 


def main(): 
    printer_name = "Canon Inkjet iP1800 series" # or get_printer_names()[0] 
    prn = win32print.OpenPrinter(printer_name) 
    error = printer_errorneous_state(prn) 
    if error: 
     print("ERROR occurred: ", error) 
    else: 
     print("Printer OK...") 
     # Do the real work 

    win32print.ClosePrinter(prn) 


if __name__ == "__main__": 
    main() 

は:どうやら、勝利は、プリンタで設定されたプリンタ名が格納されていない私の場合、プリンタはEPSONと呼ばれています******しかし、中に。 勝利、その名はEPSON ******(WF-7610シリーズ)です。だから私は、使用可能なすべてのプリンタを列挙してその名前を取得するために、いくつかの追加コード(ここには含まれていなかったコード)を書く必要がありました。