Описание проблемы
У меня есть модульный тест, который вызывает внешнюю программу и проводит некоторое тестирование. После этого внешний процесс уничтожается, и тест пытается очистить файлы, созданные внешней программой. Однако, если я просто вызову unlink()
сразу после команды kill()
в Windows 10, я получу:
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'my.log'
Если я time.sleep(4)
перед вызовом unlink()
все работает как положено. 4
выбрано произвольно, в другое время тоже работает.
MCVE
Этот MCVE состоит из двух файлов. server.py
, который просто блокирует файл журнала, и test_client.py
, который вызывает сервер, уничтожает его и, наконец, пытается удалить файл журнала.
test_client.py
import pathlib
import subprocess
import sys
import time
# Create test folder
server_path = pathlib.Path('.')
server_path.mkdir(exist_ok=True)
server_file = pathlib.Path('server.py').resolve()
# Start server in test folder
proc = subprocess.Popen([sys.executable, str(server_file)], cwd=server_path)
time.sleep(4)
# Kill server
proc.kill()
# Activate the following line to avoid the PermissionError: [WinError 32] ...
#time.sleep(4)
# Clean up
pathlib.Path('my.log').unlink()
server.py
import time
import logging
logging.basicConfig(
filename='my.log',
level=logging.DEBUG)
logging.info('I just started my work')
while True:
time.sleep(1)
Вопрос
- Есть ли способ дождаться завершения убийства?
- Бонус, если код не зависит от платформы