linux 使用Python子进程运行'eval $(something)'命令

rjjhvcjd  于 2022-12-18  发布在  Linux
关注(0)|答案(2)|浏览(182)

我在终端内运行了以下子进程/命令:
$ eval $(docker-machine env machine-name)
我假设python的等价物是:
sp = subprocess.run(["eval", "$(docker-machine env {})".format(self.project_machine_name)])
或者也许:
sp = subprocess.run(["eval", "$(docker-machine", "env", "{})".format(self.project_machine_name)])
然而,上述两种方法似乎都不起作用。
我想知道,我将如何在python脚本中运行上面的eval...

N.B. * 为简洁起见,假设self.project_machine_name = 'machine-name'*

这与调用子进程不同,因为它需要是eval()

yh2wf1be

yh2wf1be1#

尝试

sp = subprocess.run(['docker-machine', 'env', self.project_machine_name])

更多信息和其他参数-在文档中
EDIT:如果您想要输出,请使用subprocess.check_output()

mzsu5hc0

mzsu5hc02#

这取决于你想做什么,但我可能正在做一些类似的事情,我正在minikube中构建我的dockers,我有一个python脚本来构建这些dockers。
在运行Docker构建之前,我需要确保设置了正确的环境变量,这意味着我需要运行

eval $(minikube -p minikube docker-env)

它会生成一组要在shell中运行的语句(通常使用eval)

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.49.2:2376"
export DOCKER_CERT_PATH="/home/aluchko/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)

为了能够在python中触发我的构建,我需要在我使用docker构建命令时设置这些环境变量。
现在基本上有两种方法可以做到这一点(除了在脚本的 Package 器中进行eval之外),两种方法都涉及到使用export命令获取该字符串。

output = subprocess.check_output(['minikube', '-p', 'minikube', 'docker-env'])

1.解析minikube(或docker-machine命令)的结果,并在shell中为将来的子进程设置这些变量。由于您知道docker-machine命令的输出,因此使用RE可能会有点草率。shell=True只是用于回显。

output = subprocess.check_output(['minikube', '-p', 'minikube', 'docker-env'])

import re
export_re = re.compile('export ([A-Z\_]+)="(.*)"\\n')
export_pairs = export_re.findall(output.decode("UTF-8"))

build_env = os.environ.copy()

for k,v in export_pairs:
    build_env[k] = v

subprocess.run('echo $DOCKER_HOST', shell=True, env=build_env)

1.稍微草率一点,也更容易受到注入攻击,只需将字符串夹在一起,这样所有命令基本上都是一个以一堆导出开始的脚本,这几乎没有那么干净,并将您锁定在使用shell=True子进程功能上,但它确实有效。

output = subprocess.check_output(['minikube', '-p', 'minikube', 'docker-env'])
extended_output = output + b"\necho $DOCKER_HOST"
print(extended_output)

subprocess.run(extended_output, shell=True)

相关问题