Внутренне он вызывает эквивалент:
import os
import sys
f = os.popen('file -b "%s" 2> %s' % (sys.executable, os.devnull))
f.read()
f.close()
Чтобы popen()
работал, он должен иметь возможность получить сигнал SIGCHLD
, сообщающий, что дочерний процесс завершился.Похоже, что среда, в которой выполняется iotop
, имеет пользовательский процесс жнеца, который перехватывает SIGCHLD
и не позволяет python получать уведомления о выходе из процесса.Таким образом, когда функция вызывает .close()
, python пытается уничтожить уже мертвый процесс и получает ошибку от операционной системы.
Если вы не можете перенастроить среду, чтобы пропустить SIGCHLD
, я думаю, что выРо будет прибегать к отвратительному взлому.
Обтекание iotop
в скрипте, который обезьяны-патчи platform.architecture()
с функцией, которая всегда возвращает один и тот же кортеж (что-то вроде ('64bit', 'ELF')
) - для получения результата реальногоarchitecture()
) должен позволять вам прогрессировать.
Кроме того, вы можете просто сделать локальную копию файла platform.py
и отредактировать ее напрямую, установив PYTHONPATH
для задания cron, указывающего на этот новый файл.