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

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

ただいまの
回答率

88.34%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 15K+

you_19000

score 19

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

Python3.6
Chrome Driver
Selunium
Windows10 home 64bit

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

プログラム名.py run

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

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

宜しくお願いします。

【以下サンプル】

from selenium import webdriver
from time import sleep
import os
import signal
import time

chromedriver_directry = str(os.path.dirname(os.path.abspath(__file__))) + "\chromedriver.exe"
options = webdriver.ChromeOptions()
options.add_argument('--disable-infobars')  # 自動モードでの操作というバーを非表示
options.add_argument('--start-maximized')  # 非表示
driver = webdriver.Chrome(executable_path=chromedriver_directry, chrome_options=options)
driver.set_page_load_timeout(20)  # Loading time limit

def foo(sig, frame):
    x = input("""Ctrl-Cが押されました。一時停止中です。続行にはEnterを押してください。プログラム終了する場合は、q を入力:""")
    if x == "q":
        exit(1)

signal.signal(signal.SIGINT,foo)

driver.get("https://www.google.co.jp/")
sleep(5)
driver.get("https://www.yahoo.co.jp/")
sleep(5)
driver.get("https://www.goo.ne.jp/")
sleep(5)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+4

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

追記

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

import signal
import time

def foo(sig, frame):
    x = input("""
Ctrl-Cが押されました。一時停止中です。続行にはEnterを押してください。
プログラム終了する場合は、q を入力:""")
    if x == "q":
        exit(1)

signal.signal(signal.SIGINT,foo)

for i in range(1,20):
    print(i)
    time.sleep(1)


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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/05 21:35

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

    キャンセル

  • 2019/03/06 00:19

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

    キャンセル

  • 2019/03/06 09:08

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

    キャンセル

checkベストアンサー

+1

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/05 21:30

    ご回答ありがとうございます。
    一旦要件整理をして見直しを、とも思っていたのですが、
    要望を整理すると私の知識レベルで調べた限りでは実現出来ず、一旦実装を断っておりました。
    しかし、どうしても対応してほしいとその後ずっと言われており、
    私の知識不足で対応出来ないだけでは申し訳が無いと思った故一旦こちらに質問をしてみておりました。

    一旦断っていた理由でもあるのですが、止めたい理由は特に無いようなのです。
    無駄に、という意味ではなく、その時と場合により都度異なる理由で止めたいときがあるというもので、
    何かしらの分岐で対応しようとしたのですが、少なくとも私の知識では対応できませんでした。

    ただ、記載頂いた何かのファイルの有無を元に判定することは全く盲点でした。
    現状の問題は一時停止をするとコードがセッションが切れるのかChromeDriverが落ちる点であったのですが
    otn様に頂いたinput()と記載頂いたファイルの有無判定を組み合わせれば、
    任意のタイミングで止められそうな気がします。

    この後コードに加えて検証してみます。
    大変ありがとうございます。ご面倒おかけします。

    キャンセル

  • 2019/03/06 00:15

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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