在docker中从python运行bash脚本时出现了奇怪的问题
我有python脚本,它通过子流程库运行bash脚本。我需要将stdout和stderr收集到文件中,因此我有如下包装器:在docker中从python运行bash脚本时出现了奇怪的问题,python,bash,docker,Python,Bash,Docker,我有python脚本,它通过子流程库运行bash脚本。我需要将stdout和stderr收集到文件中,因此我有如下包装器: def execute_chell_脚本(阶段名称、脚本): 子进程。检查输出(“{}&>logs/{}”。格式(脚本,阶段名称),shell=True) 当我在mac上启动python脚本时,它工作正常。但是如果我在docker容器中启动它(来自ubuntu:18.04),我看不到任何日志文件。如果我使用bash-c'command&>log\u file'而不是在子流程
def execute_chell_脚本(阶段名称、脚本):
子进程。检查输出(“{}&>logs/{}”。格式(脚本,阶段名称),shell=True)
当我在mac上启动python脚本时,它工作正常。但是如果我在docker容器中启动它(来自ubuntu:18.04
),我看不到任何日志文件。如果我使用bash-c'command&>log\u file'
而不是在子流程中使用command&>log\u file
,我可以修复它。请检查输出(…)
。但它看起来太神奇了
我考虑了user的默认shell,它启动python脚本(其根),但是cat/etc/passwd
显示根/bin/bash
如果有人能告诉我发生了什么,那就太好了。也许我可以在docker文件中添加一些行,以便在docker容器内外使用相同的python脚本 正如OP在评论中报道的那样,这解决了他们的问题,我将其作为一个答案发布,以便他们能够接受 使用
检查_输出
时,你不会得到任何输出,这很奇怪;在这里要求shell=True
是错误的。你想要
以open(os.path.join('logs',stage_name')作为输出的:
subprocess.run([script],stdout=output,stderr=output)
见TanvGentaly,当您没有得到任何输出时,使用检查输出
,期望任何输出都是奇怪的;在这里要求shell=True
是错误的。您希望以open(os.path.join('logs',stage_name))作为输出:subprocess.run([script],stdout=output,stderr=output)
可能相关,&>文件
不是a,因此如果您的/bin/sh
实现了没有任何供应商扩展名的标准(sh
不是bash
)您可能会遇到麻烦。@tripleee我将我的项目改写为python 3,并使用了您的变体。它看起来更好,而且可以按照我的要求工作。谢谢