Внутри вызова подпроцесса я хочу использовать 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. В моем случае, мотивация в том, что команда исправлена, но я могу вызвать ее более одного раза с разницей в спецификациях файлов.)