2011-05-09 28 views
10

के माध्यम से सर्वर पर वर्चुअलएन्व को सक्रिय करने में समस्या मैं अपने स्टेजिंग सर्वर पर फैब्रिक के माध्यम से कुछ Django प्रबंधन आदेश चलाने की कोशिश कर रहा हूं।फैब्रिक

समस्या यह है कि ऐसा लगता है कि फैब्रिक वर्चुअलएन्व को सक्रिय करने में सक्षम नहीं है और इस प्रकार कमांड निष्पादित करते समय सिस्टम पायथन/libs का उपयोग करने में सक्षम नहीं है।

सर्वर पर Django अनुप्रयोग एक virtualenv का उपयोग कर चलाया जाता है (नहीं, मैं 'डॉन virtualenvwrapper का उपयोग अभी तक ...)

कपड़ा (1.0.1) एक आदेश का उपयोग करते हुए इस प्रकार दिखाई देंगे जब मेरे बॉक्स से चलाने :

fabfile विधि:

def collectstatic(): 
    require('settings', provided_by=[production, staging]) 

    with settings(warn_only=True): 
     run('source %(env_path)s/bin/activate && python %(repo_path)s/%(project_name)s/configs/%(settings)s/manage.py collectstatic --noinput -v0' % env) 

उत्पादन:

$ fab staging master collectstatic 
[myserver.no] Executing task 'master' 
[myserver.no] Executing task 'collectstatic' 
[myserver.no] run: source /home/newsapps/sites/mysite/env/bin/activate && python /home/newsapps/sites/mysite/repository/mysite/configs/staging/manage.py collectstatic --noinput -v0 
[myserver.no] Login password: 
[myserver.no] out: Unknown command: 'collectstatic' 
[myserver.no] out: Type 'manage.py help' for usage. 

मुझे पता है कि Django कमांड संग्रहित 1.3 से पहले के संस्करणों में मौजूद नहीं है जो सोचता है कि सिस्टम पायथन (जिसमें Django 1.2 है) का उपयोग किया जा रहा है।

मेरे fabfile/परियोजना लेआउट great fabfile of the Tribapps guys

पर आधारित है तो मैं pythonversion परीक्षण करने के लिए एक कपड़े विधि बनाया:

def pythonver(): 
    require('settings', provided_by=[production, staging]) 

    with settings(warn_only=True): 

    run('source %(env_path)s/bin/activate && echo "import sys; print sys.path" | python ' % env) 

जब चलाने यह निम्न उत्पादन देता है:

$ fab staging master pythonver 
[myserver.no] Executing task 'master' 
[myserver.no] Executing task 'pythonver' 
[myserver.no] run: source /home/newsapps/sites/mysite/env/bin/activate && echo "import sys; print sys.path" | python 
[myserver.no] Login password: 
[myserver.no] out: ['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0', 

जैसा कि आप देख सकते हैं कि यह सिस्टम पायथन का उपयोग करता है और नहीं मेरा वर्चुअलनव घर/न्यूज़एप/साइट्स/माइसाइट/एनवी

में स्थित नहीं है 210

लेकिन अगर मैं सर्वर

source /home/newsapps/sites/mysite/env/bin/activate && echo "import sys; print sys.path" | python 

पर सीधे इस आदेश चला .. तो यह virtualenv से सही पथ आउटपुट

मैं गलत क्या कर रहा हूँ के बाद से आदेशों से अजगर के साथ नहीं चल रहे हैं फैब्रिक का उपयोग कर मेरे वर्चुअलएन्व?

उत्तर

4

मैं वर्चुअलएन्व को सक्रिय करने से परेशान नहीं होगा, केवल वर्चुअलनेव के पायथन दुभाषिया को पूरा पथ दें। उसके बाद वह सही पायथनपैट, आदि का उपयोग करेगा

+0

मैं अपने virtualenv के postactivate फ़ाइल में (जैसे अपने प्रोजेक्ट की रूट निर्देशिका के रूप में) मेरी अतिरिक्त PYTHONPATH प्रविष्टियों को जोड़ने कर रहा हूँ। मुझे लगता है कि यह विधि उसमें शामिल नहीं है।क्या मुझे इन जगहों को कहीं और रखना चाहिए? – PKKid

+1

आप अपने /lib/python2.x/साइट-पैकेज/'निर्देशिका में' .pth' फ़ाइलें जोड़ सकते हैं। इनमें एक पथ हो सकता है जिसे आपके 'पायथनपथ' में जोड़ा जाएगा। मैं इसे अपनी तैनाती प्रक्रिया के हिस्से के रूप में करता हूं। –

+0

या, आप अपनी प्रोजेक्ट को एक इंस्टॉल करने योग्य पैकेज में बना सकते हैं (इसे 'setup.py' फ़ाइल दें), और इसे' pip -e' का उपयोग करके इंस्टॉल करें, जो वही काम करता है। –

3

मुझे एक ही समस्या थी। इसे आसान तरीका हल नहीं कर सका। तो मैंने वर्चुअलएन्व के अंदर पाइथन बिन फ़ाइल के लिए पूर्ण पथ का उपयोग किया। मैं पायथन में समर्थक नहीं हूं, लेकिन मुझे लगता है कि अंत में यह वही बात है। यह मेरी फैब फ़ाइल में कुछ इस तरह चला जाता है:

PYTHON = '/home/dudus/.virtualenvs/pai/bin/python' 
PIP = '/home/dudus/.virtualenvs/pai/bin/pip' 

def update_db(): 
    with cd(REMOTE_DIR + 'application/'): 
     run('%s ./manage.py syncdb --settings="%s"' % 
      (PYTHON, SETTINGS)) # syncdb 
     run('%s ./manage.py migrate --settings="%s"' % 
      (PYTHON, SETTINGS)) # south migrate 
5

आप अपने virtualenv बिन निर्देशिका से अजगर संस्करण बुलाना चाहिए तो आप यकीन है कि यह अजगर की virtualenv के संस्करण का उपयोग करता होगा।

/home/newsapps/sites/mysite/env/bin/python /home/newsapps/sites/mysite/repository/mysite/configs/staging/manage.py collectstatic --noinput -v0 
+0

"-v0" का क्या अर्थ है? Thx – lajarre

+1

@lajarre -v VERBOSITY, --verbosity = VERBOSITY वर्बोसिटी स्तर; 0 = न्यूनतम आउटपुट, 1 = सामान्य आउटपुट, 2 = वर्बोज़ आउटपुट, 3 = बहुत वर्बोज आउटपुट –

2

यह पूरी तरह से काम करेंगे :)

from __future__ import with_statement 
from fabric.api import * 
from contextlib import contextmanager as _contextmanager 

env.hosts = ['servername'] 
env.user = 'username' 
env.directory = '/path/to/virtualenvs/project' 
env.activate = 'source /path/to/virtualenvs/project/bin/activate' 

@_contextmanager 
def virtualenv(): 
    with cd(env.directory): 
     with prefix(env.activate): 
      yield 

def deploy(): 
    with virtualenv(): 
     run('pip freeze') 
संबंधित मुद्दे