Простой способ подавить вывод ткани?

Я запускаю команду на удаленном компьютере:

remote_output = run('mysqldump --no-data --user=username --password={0} database'.format(password))

Я хотел бы сделать снимок вывода, но не выводить его все на экран. Как это сделать проще всего?


person Ben McCann    schedule 26.02.2012    source источник


Ответы (4)


Похоже, вам нужен раздел Управление выводом .

Чтобы скрыть вывод из консоли, попробуйте что-то вроде этого:

from __future__ import with_statement
from fabric.api import hide, run, get

with hide('output'):
    run('mysqldump --no-data test | tee test.create_table')
    get('~/test.create_table', '~/test.create_table')

Belows - это образцы результатов:

No hosts found. Please specify (single) host string for connection: 192.168.6.142
[192.168.6.142] run: mysqldump --no-data test | tee test.create_table
[192.168.6.142] download: /home/quanta/test.create_table <- /home/quanta/test.create_table
person quanta    schedule 08.03.2012

Попробуйте это, если вы хотите скрыть все из журнала и избежать исключений, генерирующих ткань при сбое команды:

from __future__ import with_statement
from fabric.api import env,run,hide,settings

env.host_string = 'username@servernameorip'
env.key_filename = '/path/to/key.pem'

def exec_remote_cmd(cmd):
    with hide('output','running','warnings'), settings(warn_only=True):
        return run(cmd)

После этого вы можете проверить результат выполнения команд, как показано в этом примере:

cmd_list = ['ls', 'lss']
for cmd in cmd_list:
    result = exec_remote_cmd(cmd)
    if result.succeeded:
        sys.stdout.write('\n* Command succeeded: '+cmd+'\n')
        sys.stdout.write(result+"\n")
    else:
        sys.stdout.write('\n* Command failed: '+cmd+'\n')
        sys.stdout.write(result+"\n")

Это будет консольный вывод программы (обратите внимание, что нет сообщений журнала от фабрики):

* Command succeeded: ls
Desktop    espaiorgcats.sql  Pictures   Public     Videos
Documents  examples.desktop  projectes  scripts
Downloads  Music         prueba Templates

* Command failed: lss
/bin/bash: lss: command not found
person cfillol    schedule 22.06.2013

Для fabric == 2.4.0 вы можете скрыть вывод, используя следующую логику

conn = Connection(host="your-host", user="your-user")
result = conn.run('your_command', hide=True)
result.stdout.strip()  # here you can get the output
person pymen    schedule 05.11.2019
comment
Это также работает для версии 2.5.0 и, вероятно, является официальным способом скрыть вывод в серии 2.x. Я также упоминается на целевой странице fabfile.org/#how-is-it -используется, но эта функция явно не упоминается в документации по API ‹docs.fabfile.org/en/2.5/api/› .. Вместо этого читатель отсылается к документации пакета invoke: docs.pyinvoke.org/en/latest/api/ - person cknoll; 12.01.2020

Как указывают другие ответы, fabric.api больше не существует (на момент написания, fabric==2.5.0) через 8 лет после вопроса. Однако следующий последний ответ здесь подразумевает, что предоставление hide=True каждому .run() вызову является единственным / приемлемым способом сделать это.

Не удовлетворившись этим, я начал поиски разумного эквивалента контекста, в котором я мог бы указать его только один раз. Кажется, что все еще должен быть способ использовать invoke.context.Context, но я не хотел больше тратить на это деньги, и самый простой способ, который я нашел, - использовать invoke.config.Config, к которому мы можем получить доступ через fabric.config.Config без необходимости в дополнительном импорте.

>>> import fabric

>>> c = fabric.Connection(
...     "foo.example.com",
...     config=fabric.config.Config(overrides={"run": {"hide": True}}),
... )

>>> result = c.run("hostname")

>>> result.stdout.strip()
'foo.example.com'

person Samuel Harmer    schedule 13.12.2020