【发布时间】:2019-05-30 14:13:35
【问题描述】:
我的脚本将大量文件作为输入,使用subprocess.call() 调用外部程序。它可以在常规操作系统控制台上完美运行,但在使用其嵌入式 Python 2.7.x 在嵌入式环境中运行时处理 10 个左右文件后挂起。
我参考了各种类似的问题,但没有找到适合我的问题:
Python: subprocess.Popen and subprocess.call hang
还有这个深入的讨论:https://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/
它们都暗示了易受攻击的缓冲 PIPE,并建议为 stdout 和 stderr 使用类似文件的对象。所以我还添加了一个临时文本文件,打开它,并将其提供给subprocess.call() 的stdout 和stderr。它也没有工作。
我的旧代码相当简单:
# 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)
我已经混合并匹配了几个标准输出/标准错误解决方案。 包括添加:
with open(join(_script_dir, 'tmp.txt'), 'w') as tmp:
#
# old code
#
completed = subprocess.call(cmd, shell=True, stdout=tmp, stderr=tmp)
都没有用。
【问题讨论】:
标签: python subprocess