经过多年的 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,最好是作为标准输入?
不要使用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
类来获取var
using的值,/bin/echo
然后将该值发送到管道。的first
是的目的subprocess.Popen
类。
然后我们使用了first
作为second
via 管道的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 模块的官方文档以获得更多想法。
Python 不像 bash 那样扩展字符串中的变量。如果你有VAR
python 并想将其传递给 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)