Мой скрипт принимает большое количество файлов на вход, вызывая внешние программы, используя subprocess.call()
.Он отлично работает с обычных консолей ОС, но зависает после обработки примерно 10 файлов при работе во встроенной среде с использованием встроенного Python 2.7.x.
Я ссылался на различные похожие вопросы и не смог найти один работающийдля меня:
Python: subprocess.Popen и subprocess.call зависают
Подпроцесс Python зависает
Pythonвызов подпроцесса зависает
и это углубленное обсуждение: https://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/
Все они подразумевают уязвимую буферизованную PIPE и предлагают использовать файловые объекты для stdout
и stderr
.Поэтому я также добавил временный текстовый файл, открыл его и передал в stdout
и stderr
из subprocess.call()
.Это тоже не сработало.
Мой старый код довольно прост:
# script1.py
folder = "/path/to/my/folder"
for root, dirs, files in os.walk(folder):
for file in files:
path = join(root, file)
try:
cmd = ['dir', path, '1>&2']
_logger.debug(' '.join(cmd))
completed = subprocess.call(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as err:
_logger.debug(err)
else:
_logger.debug('returncode: {}'.format(completed))
print('all done!!')
основной скрипт:
try:
cmd = ['python', 'script1.py', '1>&2']
ue.log(' '.join(cmd))
completed = subprocess.call(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as err:
_logger.error(err)
Я смешал и ...Подобрал пару решений stdout / stderr.включая добавление:
with open(join(_script_dir, 'tmp.txt'), 'w') as tmp:
#
# old code
#
completed = subprocess.call(cmd, shell=True, stdout=tmp, stderr=tmp)
Ни один не работал.