cbl*_*bll 4 python subprocess docker
我正在尝试下载特定的 Docker 映像,用户将在其中输入版本。但是,如果版本不存在,Docker 将抛出错误。
我正在使用subprocess.call管道从 Python 3 连接到终端。
示例代码:
from subprocess import call
containerName = input("Enter Docker container name: ")
swVersion = input("Enter software version: ")
call(["docker", "run", "--name", "{}".format(containerName), 
      "--detach", "--publish", "8080:8080", "user/software:{}".format(swVersion)])
Run Code Online (Sandbox Code Playgroud)
如果未找到版本,docker 将在终端中输出:
docker: Error response from daemon: manifest for user/software:8712378 not found.
Run Code Online (Sandbox Code Playgroud)
如何在 Python 脚本中捕获此错误?
类似的东西:
try:
    call(["docker", "run", "--name", "{}".format(containerName), "--detach", "--publish", "8080:8080", "user/software:{}".format(swVersion)])
except:
    # How do I catch the piped response code here?`
Run Code Online (Sandbox Code Playgroud)
    如果您对程序将其输出写入stderr并没有直接与之交互感到满意,那么执行您所要求的最简单方法是使用check_call而不是call.  check_call如果它正在运行的命令退出时0的状态不是它的状态,则将引发异常。
try:
    check_call(["docker", "run", "--name", "{}".format(containerName), "--detach", "--publish", "8080:8080", "user/software:{}".format(swVersion)])
except CalledProcessError:
    print("That command didn't work, try again")
Run Code Online (Sandbox Code Playgroud)
        小智 5
您可以使用Popen函数subprocess来获取stderr和蟒蛇控制台打印,如文档说,对subprocess.call
注意 请勿将 stdout=PIPE 或 stderr=PIPE 与此函数一起使用,因为这可能会根据子进程输出量造成死锁。当您需要管道时,将 Popen 与communication() 方法一起使用。
proc = subprocess.Popen(["docker", "run", "--name", "{}".format(containerName), "--detach", "--publish", "8080:8080", "user/software:{}".format(swVersion)],stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=subprocess_flags)
proc.wait()
(stdout, stderr) = proc.communicate()
if proc.returncode != 0:
    print(stderr)
else:
    print("success")
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           12836 次  |  
        
|   最近记录:  |