我想使用子进程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/

10-16 21:51