まだプログラミングの基礎的な部分を十分理解できていないので、不明瞭な点があればご指摘ください。
以前も似たような質問をさせて頂いたのですが、未だ解決しないのでご教授願います。
現在windows7にpython2.6.6を導入してDOS窓で実行しています。
pythonからAdobeのコマンドを実行して印刷させたいのですが、
①印刷前にAdobeが終了される
②実行できてもその後コマンドプロンプトが固まってCtrl+"C"などでは終了できなくなる
など、想定と異なる動きをしてしまいます。
原因として考えているのは
①Adobeに命令した後にpythonが並列して次のコマンドを実行してしまうためにAdobeが終了する
②Adobeの終了がcommunicateの完了となっているために、次のコマンド(Adobeの終了)が行えず固まってしまう
などです。
動作を理解できていないためにシーケンス処理が誤っているのだと思うのですが、どのように修正してよいかわかりません。
書き方など細かいことなどもお教えいただけるとありがたいです。
よろしくお願いします。
以下コードです。
python
1#! /usr/bin/python 2# -*- coding: utf-8 -*- 3# 引数としてpdfとプリンターの名前を渡しています。 4########################################################################## 5import sys 6from subprocess import Popen, PIPE, check_call 7import time 8#import os 9########################################################################## 10 11########################################################################## 12def main(pdf, printer): 13 14# printer_name = 'Microsoft XPS Document Writer' 15# "Epson Laser ESC/Page (リダイレクト 2)" 16# pdf=r'C:\ipaluser\System\log\*.pdf' 17 18 # 起動していた場合、一度終了しないと印刷不可 19 cmd3 = "tasklist" 20 p3 = Popen(cmd3, shell=True, stdout=PIPE, stderr=PIPE) 21 list_out, list_err = p3.communicate() 22 if list_out.rfind('AcroRd32.exe') > -1: 23 cmd2 = "taskkill /im AcroRd32.exe /f" 24 p2 = Popen(cmd2, stdin = PIPE,stdout=PIPE, stderr=PIPE) 25 out2, err2 = p2.communicate() 26 print out2 27 print err2 28 29 30# 印刷の実行 31 acroread = r'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe' 32 cmd1 = '"%s" /t "%s" "%s"'%(acroread,pdf,printer) 33 p1 = Popen(cmd1, stdout = PIPE , stderr= PIPE) 34 out1, err1 = p1.communicate() 35 print out1 36 print err1 37 38 # Adobeの終了 39 st_time = time.time() 40 limit_time = 20 41 cmd2 = "taskkill /im AcroRd32.exe" 42 # Adobeを終了するまで繰り返す 43 while True: 44 current_time = time.time() - st_time 45 print current_time 46 # この処理の強制終了 47 if current_time > limit_time: 48 prt_exit = 0 49 break 50 # Adobeを強制終了 51 elif current_time < limit_time: 52 p2 = Popen(cmd2, stdin = PIPE,stdout=PIPE, stderr=PIPE) 53 out_test, err_test = p2.communicate() 54 print out_test 55 line = out_test.split(":") 56 if line[0] == "成功": 57 prt_exit = 0 58 break 59 return prt_exit 60########################################################################## 61 62########################################################################## 63if __name__ == '__main__': 64 pdf = sys.argv[1] 65 printer = sys.argv[2] 66# i = sys.argv[3] 67 prt = main(pdf, printer) 68 69 sys.exit (prt)
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。