使用$ 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()
,这一点很重要:如果你做了,并且在名称中包含空格的目录中,那么该目录的每个片段都将成为一个单独的参数。