2010-11-06 13 views
15

Mi piacerebbe creare un file con il nome passenger_wsgi.py su un host remoto. Mi piacerebbe utilizzare la seguente stringa per creare il contenuto del file:Come si crea un nuovo file su un host remoto in fabric (strumento di distribuzione 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) 

l'utente e di accoglienza variabili sarebbero parametri della funzione tessuto.

Sono un principiante assoluto per qualsiasi tipo di manipolazione di file in python, ma anche io non sono veramente sicuro di quale dovrebbe essere la procedura in tessuto. Dovrei creare il file localmente e poi caricarlo con il comando put di fabric (e successivamente rimuovere la versione locale)? Dovrei creare il file sull'host remoto con un comando bash appropriato (usando la corsa di fabric)? Se è così, allora come è meglio gestire tutto il "e" nella stringa - lo sfuggirà? O dovrei affrontare questo in qualche modo diverso?

risposta

4

Si potrebbe utilizzare append() o upload_template() funzioni da fabric.contrib.files

+0

Non ho ancora provato, ma questo suona esattamente come mi serve :) –

1

Quello che faccio è avere il file localmente come qualcosa . come "app.wsgi.template"

ho quindi utilizzare token nel file, come:

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

io uso tessuto a "mettere" il file verso l'host remoto, quindi usare "sed" (o funzioni equivalenti in Python) per sostituire i token "$ HOST $" e "$ USER $" con i valori desiderati.

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

Grazie :) E 'interessante vedere come gli altri si occupano di questo genere di cose! –

39

Usa 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

Grande trucco. I documenti non dicono nulla sul passare un oggetto simile a un file da inserire - dicono che è necessario fornire un percorso. Ho passato il comando 'put' dopo aver letto i documenti a causa di ciò. –

+0

i documenti più recenti confermano questo: https://sourcegraph.com/github.com/fabric/fabric/symbols/python/fabric/operations/put – amwinter

+0

@amwinter, che collega 404's - il nuovo collegamento è: http: //fabric.readthedocs .org/it/1.0.0/api/core/operations.html # fabric.operations.put – Prisoner

-1

StringIO con PUT funziona con un po 'di editing. Prova questo:

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

se avete un problema con le autorizzazioni, provate questo:

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

Questa è quasi una copia di un'altra risposta alla lettera. Le uniche aggiunte che riesco a vedere stanno usando la classe 'StringIO' invece del modulo' StringIO' e la parte 'use_sudo'. Penso che questo appartenga a un commento sulla risposta di origine, non come alla sua risposta. – BlackVegetable

+0

... ammettiamolo, la porzione di classe (che non hai enfatizzato) è molto importante in quanto fallirà come scritto nell'altra risposta senza una particolare istruzione import ... – BlackVegetable

+0

'put()' carica un file, dato un nomefile, non dato il contenuto del file raw. – Cerin

Problemi correlati