Здравствуйте!
Преамбула: Я исследователь в области спектроскопии наноматериалов. Я пользуюсь спетрометром, железо которого управляется программой “wire” с графическим интерфейсом на компьютере под операционной системой виндоус XP без доступа в интернет. Эта данность, которую я поменять не в силах - спектрметром  пользуюсь не один и замена компьютера на совреенный с современным софтом остановит  проекты десятков людей на неопределенное время.
Сущесвтенная часть моего рабочего времеи уходит на стандартизированные и рутинные измерения - т.е. мое учатие заключается в том, что нужно много раз повторить определенне движения мышкой и ввести команды с клавиатуры и иногда принимать несложные решения о дальнейших действиях в зависимости от того, какие я вижу спетры. Я захотел эту процедуру автоматизироватть.
Поскольку wire не поддерживает API (я узнавал у производителя) я пошел обходным путем: Я скачал программу wire (это та которая упправляет спектрометром) на свой персональный ноутбук, и написал питон программу, которая эмулирует нажатия клавиш на клавиатуре и движения мышкой в нужной мне последовательности (а также просматривает txt файлы со спектрами, которые генерируются программой wire в процессе работы спектрометра и принимает решения на основе анализа спкектров). Я протестировал эту программу на своем компьютеретере: все нажатия просходят как надо, все хорошо. При сборке питон проекта в exe файл (через pyinstaller)тоже все работает хорошо - на моем персональном ноутбуке. 
Но вот проблема:
Если запускать эти exe файлы на компьютере подключенном к спетрометру, то они не запускаются - windows XP не может выполнить эти файлы
Я вижу следующие пути решения:
Идея 1: Используя современный питон 3.12.4 на современном компьютере, упаковать мой проект в exe файл в режиме совместимости с XP. Протестировать также на современном ноутбуке но через винртуальную машину с XP. Возможно ли это?
Идея 2: снести с современного компа питон 3.12.4, установить на него последний питон из тех что совместимы с XP (это наверное 3.4?) и упаковать в exe. протестировать на виртуальной машине.
Идея 3: установить виртуальную машину с XP, на нее установить питон 3.4. и им же упаковать проект в exe.
Идея 4. Нарыть где нибуь в моем университете старый компьютер с XP но с доступом в интернет. Установить на него питон 3.4, упаковать проект в exe и протестировать.
В чем заключатеся мой вопрос:
Адекватны ли выше приведенные идеи или они обречены на провал? какая из них наиболее перспективная? может быть есть какой то совсем другой, очень простой путь?
Важное замечание: я не программист. Я устаовил питон, анаконду и VS code по инструкциям от чатгпт. Почти весь проект закодировали копайлот и чатгпт по моим запросам, а я только тестировал и подправлял немного. Слова “виртуальное окружение”, “интерпретатор” и т.д. мне не совсем понятны. Пожалуйста, если можно, имейте это ввиду, что я совсем новичок. Спасибо.
ниже приведу пример одной из функций, чтобы было понятно с чем я имею дело:
import sys
import os
import time
from pynput.keyboard import Controller as KeyboardController, Key
from pynput.mouse import Controller as MouseController, Button
from readConfig import readConfig
# Initialize the keyboard and mouse controllers
keyboard = KeyboardController()
mouse = MouseController()
def wireMoveTo(XYZ):
    “”“Emulates mouse movements and keypresses to move to specified coordinates in Wire software.”“”
    
    VpixelForX = readConfig(“VpixelForX:”)
    VpixelForY = readConfig(“VpixelForY:”)
    VpixelForZ = readConfig(“VpixelForZ:”)
    HpixelForX = readConfig(“HpixelForX:”)
    HpixelForY = readConfig(“HpixelForY:”)
    HpixelForZ = readConfig(“HpixelForZ:”)
    VpixelForGoTo = readConfig(“VpixelForGoTo:”)
    HpixelForGoTo = readConfig(“HpixelForGoTo:”)
    def enter_value(value):
        “”“Deletes existing text and types a new value.”“”
        for _ in range(5):
            keyboard.press(Key.backspace)
            keyboard.release(Key.backspace)
            time.sleep(0.1)
            keyboard.press(Key.delete)
            keyboard.release(Key.delete)
            time.sleep(0.1)
        keyboard.type(str(value))
        time.sleep(0.1)
    def move_and_click(x, y):
        “”“Moves mouse to a specific position and clicks.”“”
        mouse.position = (x, y)
        time.sleep(0.1)
        mouse.click(Button.left, 1)
        time.sleep(0.1)
    print(f“Moving to position {XYZ} in Wire software…”)
    for i in range(2):
        # Enter X coordinate
        print(f“Iteration {i+1}: Entering X coordinate…”)
        move_and_click(HpixelForX, VpixelForX)
        time.sleep(0.1)
        enter_value(XYZ)
        time.sleep(0.1)
         
        time.sleep(0.1)
        # Enter Y coordinate
        print(f“Iteration {i+1}: Entering Y coordinate…”)
        move_and_click(HpixelForY, VpixelForY)
        time.sleep(0.1)
        enter_value(XYZ)
        time.sleep(0.1)
         
        time.sleep(0.1)
        # Enter Z coordinate
        print(f“Iteration {i+1}: Entering Z coordinate…”)
        move_and_click(HpixelForZ, VpixelForZ)
        time.sleep(0.1)
        enter_value(XYZ)
        time.sleep(0.1)
         
        time.sleep(0.1)
        # Confirm the movement (simulating a click on ‘Go To’)
        print(f“Iteration {i+1}: Executing move command…”)
        move_and_click(HpixelForGoTo, VpixelForGoTo)
        time.sleep(0.1)
         
        time.sleep(0.1)
    print(“Move command executed successfully.”)
if __name__ == ‘__main__’:
    print('Start Testing of a function: wireMoveTo')
    print('The key press emulation will start in 5 seconds. Please switch to the Wire application and do not touch anything.')
    for i in range(5, 0, -1):
        print(f'Starting in {i} seconds…')
        time.sleep(1)
    wireMoveTo()  
    print(“Finish Testing of a function: wireMoveTo”)
    input(“Press Any Key to close.”)
В отедельном файле объявлен readconfig:
def readConfig(lineDescription):
    configdata = “nothing”
    with open(“config.txt”, “r”) as file:
        for line in file:
            if line.startswith(lineDescription):
                configdata = int(line.strip())
                break
    return configdata
if __name__ == “__main__”:
    # Example usage
    lineDescription = “waterlineCPS785”
    config_value = readConfig(lineDescription)
    print(config_value)