質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.46%

  • Python

    12384questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pythonによるAdobeを用いた印刷

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,991

getlost

score 10

まだプログラミングの基礎的な部分を十分理解できていないので、不明瞭な点があればご指摘ください。

以前も似たような質問をさせて頂いたのですが、未だ解決しないのでご教授願います。

現在windows7にpython2.6.6を導入してDOS窓で実行しています。
pythonからAdobeのコマンドを実行して印刷させたいのですが、
①印刷前にAdobeが終了される
②実行できてもその後コマンドプロンプトが固まってCtrl+"C"などでは終了できなくなる
など、想定と異なる動きをしてしまいます。

原因として考えているのは
①Adobeに命令した後にpythonが並列して次のコマンドを実行してしまうためにAdobeが終了する
②Adobeの終了がcommunicateの完了となっているために、次のコマンド(Adobeの終了)が行えず固まってしまう
などです。

動作を理解できていないためにシーケンス処理が誤っているのだと思うのですが、どのように修正してよいかわかりません。
書き方など細かいことなどもお教えいただけるとありがたいです。
よろしくお願いします。

以下コードです。

#! /usr/bin/python
# -*- coding: utf-8 -*-
# 引数としてpdfとプリンターの名前を渡しています。
##########################################################################
import sys
from subprocess import Popen, PIPE, check_call
import time
#import os
##########################################################################

##########################################################################
def main(pdf, printer):

# printer_name = 'Microsoft XPS Document Writer'
# "Epson Laser ESC/Page (リダイレクト 2)"
# pdf=r'C:\ipaluser\System\log\*.pdf'

 # 起動していた場合、一度終了しないと印刷不可
  cmd3 = "tasklist"
  p3 = Popen(cmd3, shell=True, stdout=PIPE, stderr=PIPE)
  list_out, list_err = p3.communicate()
  if list_out.rfind('AcroRd32.exe') > -1:
    cmd2 = "taskkill /im AcroRd32.exe /f"
    p2 = Popen(cmd2, stdin = PIPE,stdout=PIPE, stderr=PIPE)
    out2, err2 = p2.communicate()
    print out2
    print err2


# 印刷の実行
  acroread = r'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe'
  cmd1 = '"%s" /t "%s" "%s"'%(acroread,pdf,printer)
  p1 = Popen(cmd1, stdout = PIPE , stderr= PIPE)
  out1, err1 = p1.communicate()
  print out1
  print err1

 # Adobeの終了
  st_time = time.time()                                
  limit_time = 20        
  cmd2 = "taskkill /im AcroRd32.exe"               
   # Adobeを終了するまで繰り返す
  while True:                                          
    current_time = time.time() - st_time                
    print current_time            
      # この処理の強制終了                      
    if current_time > limit_time:
      prt_exit = 0
      break
      # Adobeを強制終了
    elif current_time < limit_time:
      p2 = Popen(cmd2, stdin = PIPE,stdout=PIPE, stderr=PIPE)
      out_test, err_test = p2.communicate()
      print out_test
      line = out_test.split(":")
      if line[0] == "成功":
        prt_exit = 0
        break
  return prt_exit
##########################################################################

##########################################################################
if __name__ == '__main__':
    pdf = sys.argv[1]
    printer = sys.argv[2]
#    i = sys.argv[3]
    prt = main(pdf, printer)

    sys.exit (prt)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

結局、別の方法で全ての印刷指令が送られたか確認して終了する、もしくは一定時間経過したら強制終了するように変更しました。お騒がせしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

まず、pythonから実行するコマンドは、直接コマンドプロンプトから手動で実行させると動作するということで良いですよね?
また、communicateは、起動したプロセスの標準入力に文字列を送信するためのものなので、プロセス終了待ちに利用するものではないです。
pollかwaitで待つべきかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/25 09:59

    回答ありがとうございます!
    印刷に関しては、引数の渡し方を間違えていたので正常に動作しなかったようです。
    このため、印刷自体は正常に動作することは確認できました。

    Adobeの終了にかんしてですが、まだ想定しているような動作は実現できていません。
    スペックの異なる複数の機種に搭載予定なので、時間指定により実行を待つことはなるべく避けたいという事情がありまして・・・。
    出来る事なら印刷の終了や印刷指令の引き渡し完了を、終了コードを貰ったりpdf自体は閉じる事を検知したりして、Adobeを終了させるコマンドに移行したいです。
    Popenをcheck_callにすると終了コード1が返ってきてしまうのですが、使えないのでしょうか。
    状況が分かりづらかったらすみません。

    キャンセル

  • 2016/03/25 14:05

    印刷司令の引き渡し完了を意味するところがよくわかっていませんが、単にwaitでPopen後にwaitするだけでは終了待ちをしてくれないのでしょうか?
    まずは一歩ずつ確認を進めるのが良いと思いますが。

    キャンセル

  • 2016/03/25 15:16

    分かりにくくてすみません。
    Popenはコマンドを実行するようシェル等に投げるだけで、その投げた先がそのコマンドを受け取れたかどうかは確認する方法がないようです。そのため、印刷コマンド実行の成否を知る術がありません。それが分かれば同期して次のコマンドを実行可能かと考えています。これでお分かり頂けるでしょうか。
    waitについてですが、Popenで起動したAdobe自身の終了を待つので固まってしまいます。そのため、次のコマンド(Adobeの終了)を実行するにはAdobeを終了しないと実行されないという矛盾した状態になってしまいます。なので、今回の場合には不向きかなと思います。
    他にもなにかアドバイスがあれば是非お願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12384questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。