2014-01-13 4 views
0

У меня есть проблема, когда команда Unix выполнен с модулем питона подпроцесса застряла: (Полный код здесь: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/func.py)Python подпроцессов выполнения команды застряло

Команда Unix является простой в месте Сортировать. Путь создается процесс:

env = os.environ.copy() 
env['LC_ALL'] = 'C' 
cmd, shell = sort_cmd(filename, sort_buffer_size) 
subprocess.check_call(cmd, env=env, shell=shell) 

где sort_cmd является:

def sort_cmd(filename, sort_buffer_size): 
    return (r"sort -z -t$'\xff' -k 1,1 -T . -S {0} -o {1} {1}" 
     .format(sort_buffer_size, filename), True) 

Входной файл (который также выходной файл) команды сортировки пусто. Перед вызовом этой команды файл не был пуст (он печатается).

Вопрос в том, является ли это проблемой python, как файл может быть пустым. (Одна из гипотез - это ошибка python 2.7: http://bugs.python.org/issue19809).

Выдача strace в процессе сортировки показала, что он застрял на futex. К сожалению, я не смог воспроизвести эту проблему, и у меня нет входного файла. Когда процесс сортировки был убит вручную, он вернулся (с ошибкой, конечно).

Я использую Gnu Coreutils 8.10

ответ

0

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

Фактически команда sort выводит свой выходной файл для записи и опорожняет его. Если это входной файл в одно и то же время, вы теряетесь.

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

+0

Использование временного файла не лучшее решение, потому что мы должны быть консервативными в отношении использования диска. Команда sort гарантирует, что все прочитает, а затем начнет запись в файл. Это может быть проблема с сортировкой gnu, но у меня недостаточно доказательств, чтобы исключить ошибки python. Кроме того, учитывая, что сортировка не выдается в параллельном режиме, я не понимаю, какой замок ему нужен. –

+0

@ShayanPooya Возможно, он начинает писать поздно, но, очевидно, файл опустел довольно рано. Все Python - это системная команда. Как уже было сказано, не имеет понятия о доступе к файлу. Так как же это? – glglgl

Смежные вопросы