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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

2回答

8183閲覧

pythonによるAdobeを用いた印刷

getlost

総合スコア24

Python

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

0グッド

1クリップ

投稿2016/03/21 01:11

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

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

現在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)

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

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

投稿2016/03/29 01:04

getlost

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2016/03/24 04:02

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

getlost

2016/03/25 00:59

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

2016/03/25 05:05

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

2016/03/25 06:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問