管道 python 变量值到 bash 脚本(在 python 脚本中)

kad*_*lfe 4 scripting python

经过多年的 bash 脚本编写,我被赋予了修改 python 脚本的任务,使其在满足某些条件时调用 shell 脚本。那部分还不错,但现在我还试图从 python 脚本中向这个 shell 脚本发送一个变量,但我迷路了。

shell 脚本采用 stdin,这是我试图放置 python 变量值的地方,它只是一个整数。

我的代码(到目前为止)如下所示:

if VAR > NUMBER:
import os
bashCommand = "echo something | /path/to/script --args"
os.system(bashCommand) 
Run Code Online (Sandbox Code Playgroud)

它工作得很好。但我想要做的是使 os.system(bashCommand) 相当于:

echo $VAR | /path/to/script --args
Run Code Online (Sandbox Code Playgroud)

甚至

echo 'some text' $VAR | /path/to/script --args
Run Code Online (Sandbox Code Playgroud)

考虑到 os.system 似乎可以工作的方式,尽管我似乎完全错误地处理了这个问题。

所以我想我的问题是如何将 VAR 的值传递给 bashCommand,最好是作为标准输入?

hee*_*ayl 6

不要使用os.system(),它已被弃用而支持subprocess模块。

在您的情况下,您可以subprocess直接使用模块,最好不要使用该shell=True参数,因为直接在 shell 中运行命令是不安全的。该subprocess模块可以模拟您在此处需要的所有功能,例如管道。

让我们以这个例子为例:

import subprocess
var = 'foobar'

first = subprocess.Popen(['/bin/echo', var], stdout=subprocess.PIPE)
second = subprocess.Popen(['bash', '/path/to/script', '--args'], stdin=first.stdout)
Run Code Online (Sandbox Code Playgroud)

我们已经定义了一个变量var,然后我们使用了subprocess.Popen类来获取varusing的值,/bin/echo然后将该值发送到管道。的first是的目的subprocess.Popen类。

然后我们使用了first作为secondvia 管道的STDIN的 STDOUT并相应地执行了bash脚本。

如果要将命令的输出保存为字符串,请改用subprocess.check_output函数,例如:

second = subprocess.check_output(['bash', '/path/to/script', '--args'], stdin=first.stdout)
Run Code Online (Sandbox Code Playgroud)

阅读subprocess 模块官方文档以获得更多想法。


Eri*_*ouf 3

Python 不像 bash 那样扩展字符串中的变量。如果你有VARpython 并想将其传递给 bash 你可以这样做

subprocess.call('echo {} | /path/to/script --args'.format(VAR), shell=True)
Run Code Online (Sandbox Code Playgroud)

如果VAR在 python 中保存了您想要扩展的 bash 变量的名称,您可以执行类似的操作:

subprocess.call('echo "${}" | /path/to/script --args'.format(VAR), shell=True)
Run Code Online (Sandbox Code Playgroud)