我想使用子进程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')
答案 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()
是很重要的:如果你这样做了,并且在名称中有空格的目录中,那个目录的每个段都将成为一个单独的参数。