我正在使用Python开发一个项目,我应该用Python执行shell脚本。
我编写了一个简单的程序,我可以用我的python代码执行shell脚本。但是现在我需要将Python代码中的某些参数传递给shell脚本,然后通过执行shell脚本打印出这些参数。
为了简单起见,目前我正在执行打印Hello World的shell脚本,但现在我想将hostname
和pp
和sp
值传递给我的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"
一般情况下,我想将hostname
,pp
和sp
值传递给我的shell脚本,如jsonStr
所示,然后从shell中打印出这些值我运行Python代码时脚本本身。
因此,每当我在jsonStr
-
start
Hello world
[0, 3, 5, 7, 9]
[1, 2, 4, 6, 8]
myhostname
end
这可以在Python中实现吗?
答案 0 :(得分:1)
有两种方法可以将变量传递给脚本:作为参数,或通过环境传递。
因为你正在尝试执行一个脚本,好像它是一个巨大的命令行(实际上不会起作用 - 特别是如果你将你的换行符转换为\\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)
现在脚本不必执行任何来访问该值;它被硬编码到脚本中。