2016-01-18 84 views
1

我想通過一個python腳本使用從XML文件中獲得的變量。一旦獲得變量,我想將這些傳遞給由shell腳本運行的命令。需要對此傳遞從python腳本成員/變量的shell腳本或命令

我的Python腳本幫助是像下面

#!/usr/bin/python 

import os 
import xml.etree.ElementTree as etree 
from hive import ThriftHive 
filename = "mood_ib_history_parameters_DEV.xml" 
__currentlocation__ = os.getcwd() 
__fullpath__ = os.path.join(__currentlocation__,filename) 

tree = etree.parse(__fullpath__) 
root = tree.getroot() 

hive_db = root.find("hive_db").text 
EDGE_HIVE_CONN = root.find("EDGE_HIVE_CONN").text 
target_dir = root.find("target_dir").text 
to_email_alias = root.find("to_email_alias").text 
to_email_cc = root.find("to_email_cc").text 
from_email_alias = root.find("from_email_alias").text 
dburl = root.find("dburl").text 
SQOOP_EDGE_CONN = root.find("SQOOP_EDGE_CONN").text 
user_name = root.find("user_name").text 
password = root.find("password").text 
IB_log_table = root.find("IB_log_table").text 
SR_DG_master_table = root.find("SR_DG_master_table").text 
SR_DG_table = root.find("SR_DG_table").text 

print hive_db 
print EDGE_HIVE_CONN 
print target_dir 
print to_email_alias 
print to_email_cc 
print from_email_alias 
print dburl 
print SQOOP_EDGE_CONN 
print user_name 
print password 
print IB_log_table 
print SR_DG_master_table 
print SR_DG_table 

的變量將是

  • hive_db
  • EDGE_HIVE_CONN
  • TARGET_DIR
  • to_email_alias
  • to_ email_cc
  • from_email_alias
  • dburl
  • SQOOP_EDGE_CONN
  • USER_NAME
  • 密碼
  • IB_log_table
  • SR_DG_master_table
  • SR_DG_table

其中將要被運行的外殼命令在shell腳本如下

ssh -i /apps/phodisvc/.ssh/id_rsa_edge_node ${SQOOP_EDGE_CONN} "sqoop import -D mapred.child.java.opts='\-Djava.security.egd=file:/dev/../dev/urandom' --connect '${dburl}' --username ${user_name} --password ${password} --query \"select CONTRACT_ID,CONTRACT_NUMBER,CONTRACT_STS_CODE,CONTRACT_STATUS,SERVICE_LINE_ID from XXCCS where \\\$CONDITIONS \" --split-by CONTRACT_NUMBER -m 4 --null-string '\\\\N' --null-non-string '\\\\N' --hive-delims-replacement '<EOL>' --boundary-query 'select (select min(CONTRACT_NUMBER) from XXCCS_DS_SAHDR_CORE) as minid ,(select max(CONTRACT_NUMBER) from XXCCS_DS_SAHDR_CORE) as maxid from dual' --target-dir ${target_dir}/XXCCS_DS_SAHDR_CORE --hive-import --hive-overwrite --hive-table ${hive_db}.XXCCS --map-column-hive CONTRACT_ID=BIGINT,SERVICE_LINE_ID=BIGINT" 

我不希望使用()調用或子()方法withing的第一個腳本,因爲我想將工作分成模塊。需要幫忙。

+0

無論意味着你用它來執行shell命令,所有的變量必須是可用的代碼一起在這​​一點上。因此,即使將任務分成子例程,也可以從中返回變量。但是,如果變量在代碼中某處不是全部已知的,那麼就沒有辦法用這些變量調用shell函數。 (你的代碼無法告訴shell代碼本身不知道什麼) – VBB

+0

你好@VBB變量總是來自第一個腳本,第二個腳本只有在成功執行第二個腳本後纔會執行。 – dataEnthusiast

回答

0

一旦你知道的變量,你就必須然後傳遞到外殼中的命令行。

cmd = 'ssh -i /apps/phodisvc/.ssh/id_rsa_edge_node {0} "sqoop import -D mapred.child.java.opts='\-Djava.security.egd=file:/dev/../dev/urandom' --connect '{1}' --username {2} --password {3} --query \"select CONTRACT_ID,CONTRACT_NUMBER,CONTRACT_STS_CODE,CONTRACT_STATUS,SERVICE_LINE_ID from XXCCS where \\\$CONDITIONS \" --split-by CONTRACT_NUMBER -m 4 --null-string '\\\\N' --null-non-string '\\\\N' --hive-delims-replacement '<EOL>' --boundary-query 'select (select min(CONTRACT_NUMBER) from XXCCS_DS_SAHDR_CORE) as minid ,(select max(CONTRACT_NUMBER) from XXCCS_DS_SAHDR_CORE) as maxid from dual' --target-dir ${target_dir}/XXCCS_DS_SAHDR_CORE --hive-import --hive-overwrite --hive-table ${hive_db}.XXCCS --map-column-hive CONTRACT_ID=BIGINT,SERVICE_LINE_ID=BIGINT"'.format(SQOOP_EDGE_CONN,user_name,password,...) 

os.sytem(Cmd) 

Doc的

String formmatting operator Ë Execute command in subshell