Я запускаю команду на удаленном компьютере:
remote_output = run('mysqldump --no-data --user=username --password={0} database'.format(password))
Я хотел бы сделать снимок вывода, но не выводить его все на экран. Как это сделать проще всего?
Я запускаю команду на удаленном компьютере:
remote_output = run('mysqldump --no-data --user=username --password={0} database'.format(password))
Я хотел бы сделать снимок вывода, но не выводить его все на экран. Как это сделать проще всего?
Похоже, вам нужен раздел Управление выводом .
Чтобы скрыть вывод из консоли, попробуйте что-то вроде этого:
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
Попробуйте это, если вы хотите скрыть все из журнала и избежать исключений, генерирующих ткань при сбое команды:
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
Для 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
Как указывают другие ответы, 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'