簡體   English   中英

通過使用Python傳遞某些參數來執行shell腳本?

[英]Execute the shell script by passing certain parameters to it using Python?

我正在使用Python開發一個項目,該項目中我應該使用Python執行shell腳本。

我寫了一個簡單的程序,就可以用我的python代碼執行shell腳本。 但是現在我需要將某些參數從我的Python代碼傳遞到Shell腳本,然后通過執行Shell腳本打印出這些參數。

為簡單起見,當前我正在執行將輸出Hello World的Shell腳本,但現在我想將hostname以及ppsp值傳遞給我的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值傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM