2010-11-06 8 views
15

Me gustaría crear un archivo con el nombre passenger_wsgi.py en un host remoto. Me gustaría utilizar la siguiente cadena para crear el contenido del archivo: Las variables¿Cómo creo un nuevo archivo en un host remoto en el tejido (herramienta de implementación de python)?

''' 
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) 

el usuario y de acogida serían parámetros de la función del tejido.

Soy un novato total en cualquier tipo de manipulación de archivos en python, pero tampoco estoy seguro de cuál debería ser el procedimiento en el tejido. ¿Debo crear el archivo localmente y luego subirlo con el comando de colocación de fabric (y eliminar la versión local luego)? ¿Debería crear el archivo en el host remoto con un comando bash apropiado (utilizando la ejecución de fabric)? Si es así, ¿cómo es mejor lidiar con todos los "y" en la cadena? ¿Tendrá algún problema el escaparse? ¿O debería abordar esto de otra manera?

Respuesta

4

Usted podría utilizar append() o upload_template() funciones de fabric.contrib.files

+0

No lo he intentado todavía, pero esto parece exactamente lo que necesito :) –

1

Lo que hago es tener el archivo localmente como algo . como "app.wsgi.template"

que luego usar tokens en el archivo, como:

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() 

utilizo tela de "poner" el archivo a través de la máquina remota, a continuación, utilizar "sed" (o funciones equivalentes en Python) para reemplazar los tokens "$ HOST $" y "$ USER $" con los valores que quiero.

run("sed -i backup -e 's/$USER$/%s' -e 's/$HOST$/%s' app.wsgi.template" % (user, host)) 
run("mv app.wsgi.template app.wsgi") 
+0

Gracias :) Es interesante ver cómo otros se refieren a este tipo de cosas! –

39

Uso StringIO con 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") 
+0

Gran truco. Los documentos no dicen nada acerca de cómo pasar un objeto similar a un archivo: dicen que necesitas proporcionar una ruta. Pasé por alto el comando 'poner' después de leer los documentos debido a eso. –

+0

los documentos más nuevos confirman esto: https://sourcegraph.com/github.com/fabric/fabric/symbols/python/fabric/operations/put – amwinter

+0

@amwinter, que enlazan los 404's - el nuevo enlace es: http: //fabric.readthedocs .org/es/1.0.0/api/core/operations.html # fabric.operations.put – Prisoner

-1

StringIO con poner trabaja con un poco de edición. Prueba esto:

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") 

si usted tiene un problema con los permisos, intente esto:

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) 
+0

Esto es casi una copia de otra respuesta textualmente. Las únicas adiciones que puedo ver son usar la clase 'StringIO' en lugar del módulo' StringIO' y la porción 'use_sudo'. Creo que esto pertenece a un comentario sobre la respuesta de origen, no como su propia respuesta. – BlackVegetable

+0

... admitidamente, la parte de la clase (que no destacó) es muy importante, ya que fallará como está escrito en la otra respuesta sin una declaración de importación en particular ... – BlackVegetable

+0

'put()' carga un archivo, dado un nombre de archivo, no se le da el contenido del archivo sin formato. – Cerin

Cuestiones relacionadas