我想在远程主机上创建一个名为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命令(使用fabric的运行)在远程主机上创建文件吗?如果是这样,那么如何最好地处理字符串中的所有“和” - 面料会逃脱吗?或者我应该以某种不同的方式解决这个问题?
答案 0 :(得分:42)
将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")
答案 1 :(得分:5)
答案 2 :(得分:1)
我所做的是将文件置于本地,如“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")
答案 3 :(得分:-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)