簡體   English   中英

Python打印:字符串格式錯誤

[英]Python print: error with string formatting

在使用結構一段時間后,我一直試圖將boto3合並到我的AWS工作流程中。 剛剛開始學習Python,因此對這些問題提前道歉。 我搜索並調試了以下腳本,然后執行了盡可能多的操作,因為以前大多數錯誤似乎都是使用Python2編寫的,而我在OSX上使用的是Python3。 很抱歉出現格式化問題,並試圖將腳本放入此處的代碼塊中。

    #!/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())

從終端執行:python 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

先謝謝您的幫助!

我認為您的問題僅僅是您不能像這樣調用print:

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

因為print(arguments)(arguments)試圖調用一個函數

嘗試將其替換為(我想%剛剛迷路了)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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