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

标签 python linux bash shell ubuntu

我正在使用 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)

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

关于python - 通过使用 Python 将某些参数传递给它来执行 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20752881/

相关文章:

php - pcntl_fork() 中超过 300 秒的最大执行时间

c++ - 为什么这个 o/P...服务器上传失败

linux - 如何使用 grep 打印一行及其匹配模式

PHP脚本被杀死没有解释

python - 如何使用 h5py 覆盖 h5 文件中的数组

node.js - linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

python - 在Python中使用正则表达式分割罗马数字

无法使用 fork 和 pipe 在 C 中执行控制台命令

python - python 的正则表达式

python - html 输出中的整数(jupyter notebook)