2017-07-26 215 views
0

我一直在嘗試將boto3併入我的AWS工作流程,稍後再使用Fabric。剛開始學習Python,對於其中的一些問題提前表示歉意。我搜索並調試了下面的腳本,因爲大部分錯誤似乎都是以Python2編寫的,而我在OSX上使用的是Python3。對於格式問題感到抱歉,並嘗試將腳本放入此處的代碼塊中。Python打印:字符串格式錯誤

#!/usr/bin/env python 
    import boto3 
    import sys 
    import argparse 
    import paramiko 


def list_instances(Filter): 
    ec2 = boto3.resource('ec2') 
    instances = ec2.instances.filter(Filters=Filter) 
    columns_format = ("%-3s %-26s %-16s %-16s %-20s %-12s %-12s %-16s") 
    print (columns_format) ("num", "Name", "Public IP", "Private IP", "ID", 
    "Type", "VPC", "Status") 
    num = 1 
    hosts = [] 
    name = {} 
    for i in instances: 
     try: 
      name = (item for item in i.tags if item["Key"] == "Name").next() 
     except StopIteration: 
      name['Value'] = '' 

     print (columns_format) % (
          num, 
          name['Value'], 
          i.public_ip_address, 
          i.private_ip_address, 
          i.id, 
          i.instance_type, 
          i.vpc_id, 
          i.state['Name'] 
         ) 
     num = num + 1 
     item={'id': i.id, 'ip': i.public_ip_address, 'hostname': 
     name['Value'], 'status': i.state['Name'],} 
     hosts.append(item) 

    return hosts 

def execute_cmd(host,user,cmd): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    try: 
     ssh.connect(host, username=user) 
     stdin, stdout, stderr = ssh.exec_command(cmd) 
     stdout=stdout.read() 
     stderr=stderr.read() 
     ssh.close() 
     return stdout,stderr 
    except paramiko.AuthenticationException as exception: 
     return "Authentication Error trying to connect into the host %s with  the user %s. Plese review your keys" % (host, user), e 

def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-n', '--name', 
        help="Filter result by name.") 
    parser.add_argument('-t', '--type', 
        help="Filer result by type.") 
    parser.add_argument('-s', '--status', 
        help="Filter result by status.") 
    parser.add_argument('-e', '--execute', 
        help="Execute a command on instances") 
    parser.add_argument('-u', '--user', default="ubuntu", 
        help="User to run commands if -e option is used.\ 
          Ubuntu user is used by default") 

    arg = parser.parse_args() 

    # Default filter if no options are specified 
    filter=[] 

    if arg.name: 
     filter.append({'Name': 'tag-value', 'Values': ["*" + arg.name + "*"]}) 

    if arg.type: 
     filter.append({'Name': 'instance-type', 'Values': ["*" + arg.type + "*"]}) 

    if arg.status: 
     filter.append({'Name': 'instance-state-name', 'Values': ["*" + arg.status + "*"]}) 

    hosts=list_instances(filter) 
    names = "" 

    if arg.execute: 
     for item in hosts: 
      names = names + " " + item["hostname"] + "(" + item["id"] + ")" 
     print ("\nCommand to execute: %s") % arg.execute 
     print ("Executed by: %s") % arg.user 
     print ("Hosts list: %s\n") % names 
     for item in hosts: 
      if item["status"] == 'running': 
      print ("::: %s (%s)") % (item["hostname"], item["id"]) 
      stdout,stderr = execute_cmd(item["ip"], arg.user, arg.execute) 
      print (stdout) 
      print (stderr) 
      else: 
      print ("::: %s (%s) is not running (command execution skiped)") % (item["hostname"], item["id"]) 

if __name__ == '__main__': 
sys.exit(main()) 

從終端Excuted:蟒蛇ec2-instances.py

,並得到下面的輸出:

%-3s %-26s %-16s %-16s %-20s %-12s %-12s %-16s 
Traceback (most recent call last): 
File "ec2-instances.py", line 97, in <module> 
sys.exit(main()) 
File "ec2-instances.py", line 78, in main 
hosts=list_instances(filter) 
File "ec2-instances.py", line 12, in list_instances 
print (columns_format) ("num", "Name", "Public IP", "Private IP", "ID", 
"Type", "VPC", "Status") 
TypeError: 'NoneType' object is not callable 

在此先感謝您的幫助!

回答

0

我認爲你的問題就是,你不能調用打印這樣的:

print (columns_format) ("num", "Name", "Public IP", "Private IP", "ID", 
"Type", "VPC", "Status") 

因爲打印(參數)(參數)試圖調用函數

嘗試來代替它(我猜

print ((columns_format) % ("num", "Name", "Public IP", "Private IP", "ID", 
"Type", "VPC", "Status")) 
+0

我加入的%只%迷路了),現在我越來越 '%-3S%-26s%-16s%-16s%-20s%-12s%-12s%-16s 回溯(最近呼叫最後): 文件 「ec2-instances.py」,線路97,在 sys.exit(主()) 文件 「ec2-instances.py」,線78,在主 主機= list_instances(過濾器) 文件「EC2 -instances.py 「第12行,在list_instances 打印(columns_format)%( 」編號「, 」姓名「, 」公網IP「, 」專用IP「, 」ID「, 」類型「, 」VPC「,」 狀態「) TypeError:不支持的操作數類型爲%:'NoneType'和'tuple'' – rummonkey

+0

您需要將所有內容都包含在()中 print(('%s%s')%('one','兩個')) 這將解決您的問題。 –

+0

太棒了!現在我有很好的標題和其他錯誤。 :(好像它越來越近了我在這裏欣賞的幫助再次感謝 '回溯(最近通話最後一個):! 文件「ec2-instances.py」,行97,在 sys.exit(主() ) 文件 「ec2-instances.py」,線78,在主主機= list_instances(過濾器) 文件 「ec2-instances.py」,第18行,在list_instances名=(在i.tags項爲項目,如果項目[ 「鍵」] ==「姓名」)的.next() AttributeError的:「發電機」對象有沒有屬性「下一個」' – rummonkey