我想使用子进程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()
来自终端的命令运行正常时,将返回:
最佳答案
"$PWD"
是一个shell扩展。如果您没有 shell (如shell=False
),则不会扩展 shell 。'%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()
,这一点很重要:如果这样做了,并且位于名称中带有空格的目录中,则该目录的每个段都将成为一个单独的参数。关于python - 将$ PWD与subprocess.Popen()结合使用会导致Docker错误,可从shell运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47137586/