2010-11-06 16 views
15

Uzaktaki ana bilgisayarda passenger_wsgi.py adıyla bir dosya oluşturmak istiyorum. Ben dosyanın içeriğini oluşturmak için aşağıdaki dizeyi kullanmak istiyorum:Kumaşta uzak bir ana bilgisayarda nasıl yeni bir dosya oluşturabilirim (python dağıtım aracı)?

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

kullanıcı ve konak değişkenleri kumaş fonksiyonunun parametreleri olacaktır.

Python'da herhangi bir tür dosya işleme için yeni bir kullanıcıyım ama aynı zamanda prosedürün kumaşta ne olması gerektiğinden emin değilim. Dosyayı yerel olarak oluşturmalı ve ardından kumaşın koyma komutunu (ve sonra yerel sürümü kaldırdıktan sonra) yüklüyor muyum? Uzak ana bilgisayardaki dosyayı uygun bir bash komutuyla oluşturmalı mıyım (kumaşın çalışmasını kullanarak)? Eğer öyleyse, o zaman dize tüm "ve" ile başa çıkmak için nasıl en iyisi olur - kumaş kaçar mı yoksa bunu farklı bir şekilde ele almalı mıyım?

cevap

4

Sen koymak ile fabric.contrib.files

+0

Henüz denemedim, ama tam olarak neye ihtiyacım var gibi geliyor :) –

1

Dosyada yerel olarak bir şey var .

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

sonra kullanmak "sed", uzak ana yanına dosyayı "koymak" için kumaş kullanın: "app.wsgi.template" gibi

sonra gibi, dosyadaki simgeleri kullanmaz ($ HOST $ "ve" $ USER $ "jetonlarını istediğim değerler ile değiştirmek için (veya Python'daki eşdeğerli fonksiyonlar)

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

Teşekkür :) Diğerleri şey bu tür başa nasıl görmek ilginç! –

39

Kullanım StringIO dan append() veya upload_template() işlevlerini kullanabilirsiniz:

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

Harika numara. Dokümanlar, dosya benzeri bir nesneyi iletmekle ilgili bir şey söylemiyorlar - bir yol sağlamanız gerektiğini söylüyorlar. Dokümanları okuduktan sonra 'put' komutunu geçtim. –

+0

en yeni dokümanlar bunu doğrular: https://sourcegraph.com/github.com/fabric/fabric/symbols/python/fabric/operations/put – amwinter

+0

@amwinter, bu bağlantıyı 404'ler - yeni link: http: //fabric.readthedocs .org/tr/1.0.0/api/core/operations.html # fabric.operations.put – Prisoner

-1

StringIO koymak ile düzenleme biraz çalışır. Bu deneyin: Eğer izinleri ile ilgili bir sorun varsa

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

, şunu deneyin:

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

Bu, başka bir cevap verbatiminin neredeyse bir kopyasıdır. Görebildiğim tek eklemeler 'StringIO 've' use_sudo' modülü yerine' StringIO 'sınıfını kullanıyor. Bence bu, kendi cevabı gibi değil, kaynak cevabı hakkında bir yorumda bulunuyor. – BlackVegetable

+0

... kuşkusuz, (vurgulamadığınız) sınıf kısmı, diğer bir cevapta belirli bir içe aktarma ifadesi olmadan yazılırken başarısız olacağından çok önemlidir ... – BlackVegetable

+0

'put()' verilen bir dosya yükler. dosya adı, ham dosya içeriği verilmez. – Cerin

İlgili konular