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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

11574閲覧

Python 実行中に一次停止したい

you_19000

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2019/02/18 16:04

編集2019/02/19 06:38

宜しくお願いします。
PythonでRPAを作りたく、
以下組合せでプログラミングをしてみました。

Python3.6
Chrome Driver
Selunium
Windows10 home 64bit

問題無く作れたのですが、
コマンドラインから以下で実行中に

プログラム名.py run

一時的に任意のタイミングで止めたいと(かつ再開もしたい)思うようになりました。

Pythonのスクリプトを実行中に任意タイミングで一次停止→再開 する方法がありましたら教えて頂けないでしょうか。

宜しくお願いします。

【以下サンプル】

Python

1from selenium import webdriver 2from time import sleep 3import os 4import signal 5import time 6 7chromedriver_directry = str(os.path.dirname(os.path.abspath(__file__))) + "\chromedriver.exe" 8options = webdriver.ChromeOptions() 9options.add_argument('--disable-infobars') # 自動モードでの操作というバーを非表示 10options.add_argument('--start-maximized') # 非表示 11driver = webdriver.Chrome(executable_path=chromedriver_directry, chrome_options=options) 12driver.set_page_load_timeout(20) # Loading time limit 13 14def foo(sig, frame): 15 x = input("""Ctrl-Cが押されました。一時停止中です。続行にはEnterを押してください。プログラム終了する場合は、q を入力:""") 16 if x == "q": 17 exit(1) 18 19signal.signal(signal.SIGINT,foo) 20 21driver.get("https://www.google.co.jp/") 22sleep(5) 23driver.get("https://www.yahoo.co.jp/") 24sleep(5) 25driver.get("https://www.goo.ne.jp/") 26sleep(5) 27

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

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

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

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

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

guest

回答3

0

input()で、キーボード入力待ちになり、Enterキーで続行します。

#追記

「コード上の任意のタイミング」ではなくて、「ユーザーが好きなタイミングで」ですか。

Python

1import signal 2import time 3 4def foo(sig, frame): 5 x = input(""" 6Ctrl-Cが押されました。一時停止中です。続行にはEnterを押してください。 7プログラム終了する場合は、q を入力:""") 8 if x == "q": 9 exit(1) 10 11signal.signal(signal.SIGINT,foo) 12 13for i in range(1,20): 14 print(i) 15 time.sleep(1)

ですかね。マルチスレッドの場合どうなるかは調べてません.

Windowsに特化した別の方法があるかも知れません。

投稿2019/02/18 16:25

編集2019/02/19 04:03
otn

総合スコア84423

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

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

you_19000

2019/02/19 00:06

ありがとうございます。 Pythonのコード内にinput()を記述した場合、 必ず記載した箇所で一時停止してしまうと思っているのですが、 例えば任意の箇所だけで一時停止することはコードの書き方によって可能でしょうか。 = 停止箇所は決められておらず、利用者の任意のタイミングで停止する。 ※かつ、利用者は実行したスクリプトを見続けてはおらず、input()の箇所で必ず停止をしてしまっても困ってしまうため。 上記方法を探しているのですが、 中々見つけることが出来ず、お手数ですが宜しくお願いします。
otn

2019/02/19 03:27

「コード上の任意のタイミング」ではなくて、「ユーザーが好きなタイミングで」ですか。 追記しておきます。
you_19000

2019/02/19 06:37

詳細回答頂きありがとうございます。 また、度々申し訳ございません。 早速頂きましたコードを試してみました。 現状まだ解決することは出来ませんでした。 今回頂いたコードを追加し、実行中にctrl + cを押してみました。 頂いたfor loopでカウントをするプログラムでは勿論正常に止まったのですが、 私の方で作成したコード上に追加し実行中にctrl + cを押すと、Chrome Driverが閉じてしまい、 コマンドプロンプト側は一時停止しているのですがChromeDriver側は閉じてしまいました。 頂いたコードを追加したサンプルのコードを本文に記載させて頂きます。 もし良い案がありましたら教えて頂けないでしょうか... どうぞ宜しくお願い致します。
otn

2019/03/05 12:35

別のアプローチとして、Windowsのリソースモニターから、プロセスの中断、プロセスの再開はどうでしょうか?
you_19000

2019/03/05 15:19

すみません。回答頂いていたことに気が付かずに締めてしまいました。 後ほど試してみます。ありがとうございます
otn

2019/03/06 00:08

処理内容に無関係に止めるので、全然駄目かも知れません。
guest

0

ベストアンサー

そもそもの実装を見直されてはいかがでしょうか。
現状のコード修正を最小限に対応したいとは良くある状況かと思いますが、様々な状況でうまく動作させることは困難かと思われます。

例えば、途中で停止したいとはどのような場合なのかを把握して、そのような場合に停止できるようにすることを検討してはいかがでしょうか。

単純に多くのページをクロールする際に処理ループがあり、メインはそのクロール実施に時間がかかるということであれば、その処理ループの中で一時停止処理を入れ込むなど。

一時停止・再開の簡単な実装は、例えばファイルの有無で判断するものがあります。
メインのスクリプトとは別に、一時停止をする機能で所定のファイルを作成させ、再開する機能では所定のファイルを削除するようにすれば良いです。

投稿2019/03/05 08:07

t_obara

総合スコア5488

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

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

you_19000

2019/03/05 12:30

ご回答ありがとうございます。 一旦要件整理をして見直しを、とも思っていたのですが、 要望を整理すると私の知識レベルで調べた限りでは実現出来ず、一旦実装を断っておりました。 しかし、どうしても対応してほしいとその後ずっと言われており、 私の知識不足で対応出来ないだけでは申し訳が無いと思った故一旦こちらに質問をしてみておりました。 一旦断っていた理由でもあるのですが、止めたい理由は特に無いようなのです。 無駄に、という意味ではなく、その時と場合により都度異なる理由で止めたいときがあるというもので、 何かしらの分岐で対応しようとしたのですが、少なくとも私の知識では対応できませんでした。 ただ、記載頂いた何かのファイルの有無を元に判定することは全く盲点でした。 現状の問題は一時停止をするとコードがセッションが切れるのかChromeDriverが落ちる点であったのですが otn様に頂いたinput()と記載頂いたファイルの有無判定を組み合わせれば、 任意のタイミングで止められそうな気がします。 この後コードに加えて検証してみます。 大変ありがとうございます。ご面倒おかけします。
you_19000

2019/03/05 15:15

頂いたやり方で実現することが出来ました。 大変助かりました。ありがとうございます。
guest

0

最終的に以下該当箇所抜粋ですが、
メモ帳に特定の文字列を入力して保存すればChromeDriverを落とさずに一時停止が出来ました。
※Sleepでなくとも記載頂いたinput()でも良いと思います。

python

1for i in range(0,100): 2 driver.get("xxxxxxxxx") 3 fl = open('text.txt') 4 vl = fl.readline() 5 fl.close() 6 if vl == "off\n": 7 sleep(1000)

投稿2019/03/05 15:16

you_19000

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問