[英]Execute the shell script by passing certain parameters to it using Python?
我正在使用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
值傳遞給jsonStr
所示的Shell腳本,然后在運行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)
現在,腳本無需執行任何操作即可訪問該值。 它被硬編碼到腳本中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.