独立的fabric fabfile?
有没有办法让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()
希望这个对大家有帮助...