@benpython: Noch mal der Hinweis auf die Namenschreibweise: klein_mit_unterstrichen.
Der Code auf Modulebene sollte in einer Hauptfunktion verschwinden.
Den Pfad zur EXE würde ich als Konstante definieren, denn der Pfad beziehungsweise der Dateiname wird ja mehrfach im Code benötigt und sollte nicht mehrfach dort stehen.
`os.system()` sollte man nicht mehr verwenden. Zum starten von externen Prozessen gibt es das `subprocess`-Modul. Damit kann man die Prozesse dann unter anderem auch ohne eine unnötige zusätzliche Shell ausführen.
Funktioniert das beenden des/der Prozesse(s) so überhaupt? Die " sagen der Shell ja, dass das *ein* Element ist, also dass das Programm ``taskkill /f /im DPDPrint.exe`` heisst und keine Argumente bekommt. Das Programm heisst doch aber nur ``taskkill``und der Rest sind die Argumente. Warum wird das dreimal ausgeführt?
Ich würde an der Stelle auch eher das `psutil`-Modul verwenden, statt ein externes Programm zu starten.
Funktioniert das starten grundsätzlich nicht oder nur einmal? Denn der Code funktioniert so wie er da steht ja nur wenn das Starten von ``DPDPrint.exe`` nicht blockiert.
Code: Alles auswählen
#!/usr/bin/env python3
import os
import subprocess
import time
from pathlib import Path
import pyautogui
import pygetwindow
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
#
# Set your environment variable with
# ``os.environ["dpdPrintPassword"] = "yoursecretpassword"``.
#
PASSWORD = os.environ.get("dpdPrintPassword")
DPD_EXE_PATH = Path(R"C:\Program Files (x86)\DPD\DPDPrint\DPDPrint.exe")
WINDOW_TITLE = "DPD Print"
def kill_dpd():
#
# TODO Use `psutil` instead of starting an external program.
#
for _ in range(3):
subprocess.run(
["taskkill", "/f", "/im", DPD_EXE_PATH.name], check=True
)
def activate_first_window(window_title):
window = pygetwindow.getWindowsWithTitle(window_title)[0]
window.activate()
return window
def restart_dpd():
for window in pygetwindow.getAllTitles():
window.minimize()
#
# FIXME Is this blocking?
#
subprocess.run([str(DPD_EXE_PATH)], check=True)
time.sleep(60) # Wait till login is loaded.
activate_first_window(WINDOW_TITLE)
pyautogui.click(859, 496) # TODO Document what this position means.
time.sleep(1)
pyautogui.write(PASSWORD, interval=0.05)
time.sleep(1)
pyautogui.click(735, 527) # TODO Document what this position means.
time.sleep(60)
#
# Start import service.
#
dpd_print_window = activate_first_window(WINDOW_TITLE)
time.sleep(2)
if not dpd_print_window.isMaximized:
dpd_print_window.maximize()
time.sleep(2)
pyautogui.click(1355, 127) # TODO Document what this position means.
def main():
scheduler = BlockingScheduler(timezone="Europe/Berlin")
scheduler.add_job(kill_dpd, CronTrigger(hour=23))
scheduler.add_job(restart_dpd, CronTrigger(hour=4))
scheduler.print_jobs()
scheduler.start()
if __name__ == "__main__":
main()