如何在Fabric(Python部署工具)中在远程主机上创建新文件?

19 投票
4 回答
9635 浏览
提问于 2025-04-16 06:40

我想在远程主机上创建一个名为 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 这个库。

撰写回答