独立的fabric fabfile?

9 投票
10 回答
4562 浏览
提问于 2025-04-16 01:30

有没有办法让fabfile独立运行呢?
我不是很喜欢使用外部工具'fab'。如果我能让fabfile独立运行,就可以直接在(Eclipse / Pydev)这个开发环境里运行这个文件,轻松调试,还能使用项目的配置和路径等等。
为什么这样做不行:

from fabric.api import run

def host_type():
    run('uname -s')

if __name__ == '__main__':
    host_type()    

10 个回答

2

这不是一个特别好的解决办法,但可以用得上:

import subprocess

def hello():
    print 'Hello'

if __name__ == '__main__':
    subprocess.call(['fab', '-f', __file__, 'hello'])
3

如果我没记错的话,我也没能让Fabric API按我想要的方式工作。所以我决定完全放弃这个额外的层,直接使用Paramiko(Fabric背后的SSH库):

import os
import paramiko

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname.example.com', 22, 'username', 'password')
ssh.save_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
stdin, stdout, stderr = ssh.exec_command('uname -s')
print stdout.read()

虽然这样做需要多一些步骤,但这样可以直接利用SSH层,而不是用subprocess去启动另一个Python实例,或者去搞懂Fabric API。我有几个项目,无论是网页的还是控制台的,都是用这种方式使用Paramiko的,遇到的问题不算太多。

Paramiko有详细的文档

14

我最终找到了一个解决办法(其实非常简单!)。
在我的fabfile里,我添加了:

from fabric.main import main

if __name__ == '__main__':
    import sys
    sys.argv = ['fab', '-f', __file__, 'update_server']
    main()

希望这个对大家有帮助...

撰写回答