Как добавить опцию с помощью CLIC CLI и правильно передать опцию в функции?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как добавить опцию с помощью CLIC CLI и правильно передать опцию в функции?

Сообщение Anonymous »

Я прохожу свой первый курс программирования, поэтому, пожалуйста, простите, если вопросы слишком наивны.
Я использую модуль Python boto3 и «щелкните» библиотеку, чтобы создать интерфейс командной строки, который управляет экземплярами EC2.
Code: < /p>

Код: Выделить всё

@click.group()
@cli.group('instances')
def instances():
pass
@instances.command('list')
@click.option('--project', default=None,help='List instances by project tag, e.g. -project = 
')
def list_instances(project):
'List EC2 instances'
instances = filter_project_instances(project)
for i in instances:
print(', '.join((
i.id,
i.instance_type,
)))
return

@cli.group('volumes')
#Details of this 'volumes' command are omitted for simplification
Basically, 'Click' allows me to wrap my functions with commands (e.g. instances, volumes), subcommands(list) and option (--project).
Such a command line:
shotty.py instances list --project Valkyrie
can list instances that are tagged with the name 'Valkyrie' < /p>
Теперь мне нужно добавить опцию в эту командную строку, чтобы указать профиль AWS, который я хочу использовать для входа. Список
Первоначально я резко кодировал имя профиля и использовал session и ec2 как глобальные переменные, которые могут использовать любые другие функции.

Код: Выделить всё

import boto3
import botocore
import click

session = boto3.Session(profile_name='Dan')
ec2 = session.resource('ec2')
< /code>
Несмотря на реализацию вышеуказанного требования, на основе документов «щелкнуть», мне пришлось сделать следующее, чтобы добавить такую ​​опцию «-профиля»: < /p>
@click.group()
@click.option('--profile', default=None,help='Select the AWS profile')
def cli(profile):
session = boto3.Session(profile_name=profile)
ec2 = session.resource('ec2')
Но теперь, session и ec2 больше не доступны для других функций.

Код: Выделить всё

if __name__ == '__main__':
cli()
< /code>
Мой единственный подход, о котором я мог придумать, было создание отдельной функции < /p>
  def session(profile):
session = boto3.Session(profile_name=profile)
ec2 = session.resource('ec2')
return ec2
Но теперь это вызывает еще одну проблему, которую я должен добавить профиль в качестве параметра ко всем другим функциям, например,

Код: Выделить всё

def filter_project_instances(project, profile):
'Filter EC2 instances'
ec2 = session(profile)
instances = ec2.instances.all()
return instances

Это означает, что я должен определить profile снова в этой функции filter_project_instances . Это не имеет большого смысла для меня. Любая помощь будет оценена!>

Подробнее здесь: https://stackoverflow.com/questions/631 ... -functions
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»