web-dev-qa-db-ja.com

WindowsのバックグラウンドでPythonスクリプトを常に実行する方法は?

ファイルをあるフォルダから別のフォルダに移動するスクリプトを作成しました。ただし、元のフォルダーはDownloadsフォルダーなので、常にバックグラウンドで実行する必要があります。

また、次のような標準のバッチファイルもあります。

@py C:\\Python\Scripts\moveDLs.py %*

Windows 1を使用しています。バッチファイルでNohupを使用する方法に関するLinuxおよびOSの情報を見つけました。 Windowsバージョンはありますか?

ある場合、PCを再起動またはオンにするたびにスクリプトを実行する必要がありますか?

また、プロセスを永続的にすることができた場合、プロセスをどのように終了しますか?

どうもありがとう

3
Thanos Dodd

Windowsでは、バックグラウンドプロセスとしてpythonスクリプトを実行するために pythonw.exe を使用できます。

Pythonスクリプト(拡張子.pyが付いたファイル)は、デフォルトでpython.exeによって実行されます。この実行可能ファイルはターミナルを開き、プログラムがGUIを使用している場合でも開いたままになります。これを望まない場合は、拡張機能.pywを使用します。これにより、スクリプトはデフォルトでpythonw.exeによって実行されます(両方の実行可能ファイルは、Pythonインストールディレクトリ)これにより、起動時にターミナルウィンドウが表示されなくなります。

例えば、

C:\ThanosDodd\Python3.6\pythonw.exe C:\\Python\Scripts\moveDLs.py

スクリプトを継続的に実行するには、イベントのスケジューリングに役立つ sched モジュールを使用できます。

Schedモジュールは、汎用イベントスケジューラを実装するクラスを定義します

import sched
import time

event_schedule = sched.scheduler(time.time, time.sleep)

def do_something():
    print("Hello, World!")
    event_schedule.enter(30, 1, do_something, (sc,))

event_schedule.enter(30, 1, do_something, (s,))
event_schedule.run()

Windowsでバックグラウンドプロセスを強制終了するには、次のコマンドを実行するだけです。

taskkill /pid processId /f

ここで、processIdは、強制終了するプロセスのIDです。

1

1つのオプションは、スクリプトを変更して、繰り返しではなく継続的に実行することを目的とすることです。すべてをwhileループでラップし、スリープを追加するだけです。

import time

while True:
   your_script_here
   time.sleep(300)

これがマシンで確実に起動し、例外が発生した場合に自動再起動を提供するために、非吸引サービスマネージャー(www.nssm.cc)を使用してWindowsサービスにすることをお勧めします。これにはいくつかの手順がありますが(ドキュメントを参照)、スクリプトが完了すると、標準のservices.mscユーティリティから開始および停止できる別のWindowsサービスになります。

1
SimonN

私はうまくいく解決策を見つけました:

import shutil, os, time

while True:
    for filename in os.listdir('folderToMoveFrom'):
        if filename.endswith((desired file extensions)):
            shutil.move( (folderToMoveFrom + filename), folderToMoveTo)
    time.sleep(6)

Time.sleep()関数なしで上記のコードを実行すると、「ファイルが見つかりません」エラーが別の「ファイルが見つかりません」エラー内にネストされているため、新しいファイルがフォルダーに入った後にプログラムがクラッシュします。それが何であるかはわかりませんが、これまでのところは満足しています。スクリプトをタスクスケジューラに追加してPythonwで実行するだけで、バックグラウンドプロセスとして動作します。または、pythonwに適切な命令を追加することを忘れない限り、スクリプトを実行する代わりに、バッチファイルを実行できます。もちろん、プロセスを1回だけ開始する必要があります。

0
Thanos Dodd