Как запустить команду, только когда файл открыт - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь изменить имя файла, пока работает другой файл, и когда я выхожу из текущего файла, я хочу, чтобы измененное имя файла вернулось к его исходному имени

код, который я использовал только кажется, что открывает файл и игнорирует команды под ним, был бы очень признателен за помощь.

import os
import time


if os.startfile(r'C:\Users\Michael\Desktop\test\file.exe'):
    time.sleep(3)
    os.rename(r'C:\Users\Michael\Desktop\test\name.txt',r'C:\Users\Michael\Desktop\test\name2.txt')

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

У меня под рукой нет компьютера Windows, поэтому я не могу это проверить. Однако документация Python для os.startfile (https://docs.python.org/3/library/os.html) ничего не указывает относительно возвращаемого значения. Это заставляет меня подозревать, что возвращаемое значение - None или что-то в этом роде. Если это так, то это объясняет, почему ваш блок кода не запускается.

Эта строка из этой документации должна быть полезной:

startfile () возвращается, как только связанное приложение запущен. Нет возможности дождаться закрытия приложения и нет способа получить статус выхода приложения.

Следовательно, поскольку вы пытаетесь что-то сделать (например, вернуть имя файла) один раз процесс завершается, вы хотите использовать другую функцию, отличную от os.startfile. Я не так хорошо знаком с Windows, так что, возможно, кто-то другой сможет указать вам правильное направление.

0 голосов
/ 06 мая 2020

Что-то вроде этого может сработать, но это, вероятно, не лучшая идея:

EDIT: добавлены отпечатки и time.sleep для проверки каждые 10 секунд

import os
import psutil
import time


process_name = 'some_process'
file_name = 'some_file_path'
replacement = 'some_replacement_file_name'

while True:
    print(f'looking for {process_name}')
    time.sleep(10)
    if process_name in (p.name() for p in psutil.process_iter()):
        print(f'{process_name} started')
        os.rename(file_name, replacement)
        while True:
            time.sleep(10)
            if not process_name in (p.name() for p in psutil.process_iter()):
                print(f'{process_name} stopped')
                os.rename(replacement, file_name)
                break
...