Skip to main content
 首页 » 编程设计

python之通过使用 Python 将某些参数传递给它来执行 shell 脚本

2023年11月22日106lautakyan007

我正在使用 Python 开发一个项目,我应该在其中使用 Python 执行 shell 脚本。

我已经编写了一个简单的程序,我可以从中使用我的 python 代码执行 shell 脚本。但现在我需要将某些参数从我的 Python 代码传递到 shell 脚本,然后通过执行 shell 脚本打印出这些参数。

为了简单起见,目前我正在执行将打印出 Hello World 的 shell 脚本,但现在我想传递 hostnameppsp 值到我的 shell 脚本,然后在 Python 客户端执行时从 shell 脚本打印出这些值。

#!/usr/bin/python 
 
import subprocess 
import json 
import socket 
 
hostname = socket.gethostname() 
 
jsonData = '{"desc": "some information about the host", "pp": [0,3,5,7,9], "sp": [1,2,4,6,8]}' 
jj = json.loads(jsonData) 
 
print jj['pp'] # printing it from Python program for now 
print jj['sp'] # printing it from Python program for now 
 
print hostname # printing it from Python program for now 
 
# pass the above values to my shell script 
jsonStr = '{"script":"#!/bin/bash\\necho Hello World\\n"}' 
j = json.loads(jsonStr) 
 
print "start" 
subprocess.call(j['script'], shell=True) 
print "end" 

一般来说,我想将 hostnameppsp 值传递给我的 shell 脚本,如 jsonStr< 所示 然后在我运行 Python 代码时从 shell 脚本本身打印出这些值。

所以每当我在 jsonStr-

中执行我的 shell 脚本时,它应该像这样打印出来
start 
Hello world 
[0, 3, 5, 7, 9] 
[1, 2, 4, 6, 8] 
myhostname 
end 

这可以用 Python 实现吗?

请您参考如下方法:

有两种方法可以将变量传递给脚本:作为参数或通过环境传递。

因为您正试图将脚本当作一个巨大的命令行来执行(这实际上不起作用——尤其是当您将换行符转义为 \\n 时,所以 shell将整个事情视为一条线——但让我们假设它会这样),你不能传递参数,所以你需要传递一个环境。

这是微不足道的:

env = {} 
env.update(os.environ) 
env.update(jj) 
subprocess.call('echo ${pp}', shell=True, env=env) 

这将打印出 jj[pp] 中的内容,并返回 0

为什么?那么,在 bash 中,${pp} 表示“环境变量 pp 中的任何内容”。我们将 jj 中的每个键值对复制到 env 环境中,因此环境变量 pp 具有 jj 中的任何值[pp]。 (在某些情况下你可能想引用一些东西,例如 "${pp}",但是对于 echo 没有理由这样做,而且你不知道你在做什么将在你的现实代码中做我无法猜测你可能需要什么。)


如果你真的有一个你想调用的脚本,存储在一个文件中,那么你当然可以像对待通过 subprocess 运行的任何其他程序一样传递参数,并且在脚本中,您可以将它们引用为 $1 等。


但是,我不明白为什么您需要将参数传递给您正在构建的脚本。只需将值构建到脚本中即可。虽然这通常是个坏主意,但这主要是因为即时构建脚本是个坏主意,而且您出于某种原因已经致力于该部分。在 Python 中格式化您的字符串,您可以在其中使用 str.format%(根据您的喜好)和整个 Python stdlib 的全部功能。例如:

script = 'echo {}'.format(shlex.quote(jj['pp'])) 
subprocess.call(script, shell=True) 

现在脚本不需要做任何事情来访问这个值;它被硬编码到脚本中。