在python程序中運行shell腳本

#!/usr/bin/python
# 導入各種模塊
import sys
...

# 各種變量
consul_ip = sys.argv[2]
install_path = ...
...

# 使用os.system()在python執行shell命令
os.system('mkdir -p '+install_path)
...
# 進一步對變量進行處理成 “export install_path= /opt” 形式
def create_env_str(env_dict):
    import pdb
    pdb.set_trace()
    env_str = ""
    for k, v in env_dict.items():
        env_str = env_str + "export " + k + "=" + v + "\n"
    return env_str

# 將變量設置成字典,以便傳遞到shell腳本中使用
env_dict = {
    "install_path": install_path,
    "current_dir": current_dir,
    "req_path": req_path,
    "deps_path": deps_path,
    "packages": packages,
    "log_path": log_path,
    "consul_ip": sys.argv[2]
}

# 創建可執行shell腳本
def gen_script_fire(env_dict):
    env = create_env_str(env_dict)
    # shell中要執行的具體的指令
    cmd = '''
#此處是往“/tmp/vmware-exporter-systemctl”文件中寫內容,配置服務
sudo cat >/tmp/vmware-exporter-systemctl<<EOF
[Unit]
Description=Vmware Exporter
After=network.target
[Service]
ExecStart=/usr/bin/python ${install_path}/vmware_exporter/vmware_exporter/vmware_exporter.py -c ${consul_ip}
[Install]
WantedBy=default.target
EOF
...

'''
    # 開始寫
    with open('/tmp/service_firewalld.sh', 'w+') as f:
        f.write("#!/bin/bash" + "\n")
        f.write(env)
        f.write(cmd)

def run(cmd):
# 用subprocess.call 方法執行shell腳本
    ret = subprocess.call(cmd, shell=True)
    if ret != 0:
        sys.exit('Exec cmd %s error, return value: %s' % (cmd, str(ret)))

def run_script():
    run("sudo bash /tmp/service_firewalld.sh")

gen_script_fire(env_dict)
run_script()

注意:

cmd= ”’ ”’ 中有expect命令時,可能出現expect spawn not found錯誤

原因:expec不是shell中的命令,所以在執行bash shellname.sh時會報錯
解決:參考:http://blog.csdn.net/chinabluexfw/article/details/7461944
1. 不用bashsh執行shell腳本,使用./shellname.sh命令執行
2. 使用chmod +x shellname.sh賦權限

發佈了59 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章