Правильное заклинание подпроцесса с shell=True, чтобы получить вывод и не зависнуть

Внутри вызова подпроцесса я хочу использовать shell=True, чтобы он выполнял подстановка имен путей (код ниже), однако это имеет раздражающий побочный эффект, заключающийся в том, чтоподпроцесспорождает дочерний процесс (который затем должен быть `communicate()d/ poll ()ed/wait()ed/terminate()d/kill()ed/whatevah).

(Да, я знаю, что подстановку также можно выполнить с помощью fnmatch/ glob, но, пожалуйста, покажите мне «правильное» использование подпроцесса для этого, т.е.минимальное заклинание для получения стандартного вывода и остановки дочернего процесса.)

Это работает нормально (возвращает вывод):

subprocess.check_output(['/usr/bin/wc','-l','[ AZ]*/[AZ]*.F*'], shell=False)

но это зависает

subprocess.check_output(['/usr/bin/wc','-l','[AZ] */[AZ].*.F*'], shell=True)

(PS: серьезно раздражает, что вы не можете сказать подпроцессу, что хотите некоторые, но не всефункциональность оболочки, например подстановка, но не порождение.Я думаю, что в этом есть достойный PEP, если кто-то хочет прокомментировать, то есть передать кортеж логических значений или или двоичных флагов)

(PPS: идиома о том, проходите ли вы подпроцесс ...(cmdstring.split() или [...])- это просто тривиальная идиоматическая разница. Я говорю помидор, вы говорите tomay-to. В моем случае, мотивация в том, что команда исправлена, но я могу вызвать ее более одного раза с разницей в спецификациях файлов.)

5
задан Community 23 May 2017 в 12:25
поделиться