[英]Using $PWD with subprocess.Popen() results in a Docker error, works from shell
我想使用子进程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:来自守护程序的错误响应:创建$ PWD:“ $ PWD”包含本地卷名的无效字符,只有“ [a-zA-Z0-9] [a-zA-Z0-9_ .-]“。\\ n请参阅\\'docker run --help \\'。\\ n')
"$PWD"
是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()
,这一点很重要:如果这样做了,并且位于名称中带有空格的目录中,则该目录的每个段都将成为一个单独的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.