如何在Fabric(Python部署工具)中在远程主机上创建新文件?
我想在远程主机上创建一个名为 passenger_wsgi.py 的文件。我想用下面的字符串来作为文件的内容:
'''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
''' % (user,host,user,host)
这里的用户和主机变量会作为 fabric 函数的参数。
我对用 Python 操作文件完全是个新手,而且我也不太确定在 fabric 中应该怎么做。我是应该先在本地创建这个文件,然后用 fabric 的 put 命令上传到远程主机(然后再删除本地的版本)吗?还是应该直接在远程主机上用合适的 bash 命令创建这个文件(使用 fabric 的 run 命令)?如果是这样的话,怎么处理字符串中的所有 " 和 ' 符号呢?fabric 会自动处理这些吗?还是说我应该用其他方式来解决这个问题?
4 个回答
2
我把文件保存在本地,命名为“app.wsgi.template”。
在这个文件里,我会使用一些标记,比如:
import sys, os
sys.path.insert(0, "/ruby/$HOST$/www/$HOST$/django-projects")
sys.path.insert(0, "/ruby/$HOST$/www/$HOST$/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
然后我用fabric这个工具把文件传到远程服务器上,再用“sed”(或者Python里类似的功能)把“$HOST$”和“$USER$”这些标记替换成我想要的具体值。
run("sed -i backup -e 's/$USER$/%s' -e 's/$HOST$/%s' app.wsgi.template" % (user, host))
run("mv app.wsgi.template app.wsgi")
44
使用 StringIO 和 put:
text = '''
import sys, os
sys.path.insert(0, "/ruby/%s/www/%s/django-projects")
sys.path.insert(0, "/ruby/%s/www/%s/django-projects/project")
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
application = django.core.handlers.wsgi.WSGIHandler()
''' % (user, host, user, host)
import StringIO
put(StringIO.StringIO(text), "remote-path")
5
你可以使用 append()
或 upload_template()
这两个函数,它们来自于 fabric.contrib.files 这个库。