使用$ PWD和subprocess.Popen()导致Docker错误,从shell开始工作

时间:2017-11-06 12:59:18

标签: python docker subprocess

我想使用子进程Popen:

从python运行docker命令
proc = subprocess.Popen(
    shlex.split(r'docker run -v $PWD:/data blang/latex pdflatex main.tex'),
    cwd=temp_dir, shell=False, stdout=subprocess.PIPE, 
stdin=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

当来自终端的命令工作正常时,返回:

  

(B '',    b'docker:来自守护进程的错误响应:create $ PWD:“$ PWD”包含本地卷名的无效字符,只有“[a-zA-Z0-9] [a-zA-Z0-9 _.-]”是允许。\ n查看\'docker run --help \'。\ n')

1 个答案:

答案 0 :(得分:3)

"$PWD"是一个shell扩展。如果您没有shell(与shell=False一样),则不会扩展。

'%s:/data' % os.getcwd()是一个Python表达式,它与shell中的"$PWD:/data"具有相同的结果。因此:

import os, subprocess
proc = subprocess.Popen(
    ['docker', 'run',
     '-v', '%s:/data' % os.getcwd(),
     'blang/latex', 'pdflatex', 'main.tex'],
    cwd=temp_dir, shell=False, stdout=subprocess.PIPE, 
    stdin=subprocess.PIPE, stderr=subprocess.PIPE)

在这种情况下不要使用shlex.split()是很重要的:如果你这样做了,并且在名称中有空格的目录中,那个目录的每个段都将成为一个单独的参数。