繁体   English   中英

将$ PWD与subprocess.Popen()结合使用会导致Docker错误,可从shell运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM