19

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

用户和主机变量将是结构函数的参数。

我是 python 中任何类型的文件操作的新手,但我也不确定在结构中应该是什么过程。我应该在本地创建文件,然后使用fabric的put命令上传它(然后删除本地版本)吗?我应该使用适当的 bash 命令(使用结构的运行)在远程主机上创建文件吗?如果是这样,那么最好如何处理字符串中的所有 " 和 ' - 织物会逃脱它吗?或者我应该以某种不同的方式解决这个问题?

4

4 回答 4

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")
于 2011-08-11T14:10:42.037 回答
5

您可以使用fabric.contrib.files 中append()的orupload_template()函数

于 2010-11-06T20:13:39.540 回答
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")
于 2010-11-06T19:40:16.187 回答
-1

带有 put 的 StringIO 只需稍加编辑即可工作。试试这个:

put(StringIO.StringIO(
'''
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)), "remote-path")

如果您有权限问题,请尝试以下操作:

put(StringIO.StringIO(
'''
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)), "remote-path", use_sudo=True)
于 2015-11-03T03:14:53.317 回答