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

我想要使​​用subprocessPopen从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() 

虽然从terminal的命令完美的工作,这返回:

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

"$PWD"是一个shell扩展。 如果你没有shell(如shell=False ),它不会被扩展。

'%s:/data' % os.getcwd()是一个Pythonexpression式,与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() ,这一点很重要:如果你做了,并且在名称中包含空格的目录中,那么该目录的每个片段都将成为一个单独的参数。