2010-07-19 12 views
8

क्या fabfile स्टैंड-अलोन बनाना संभव है?
मैं बाहरी उपकरण 'fab' चलाने का बहुत शौक नहीं हूं। अगर मैं, fabfile स्टैंडअलोन मैं (ग्रहण/Pydev) आईडीई के भीतर से फ़ाइल चला सकते हैं पाने के लिए प्रबंधन आसानी से इसे, उपयोग परियोजना विन्यास और रास्तों आदि डिबग
क्यों यह काम नहीं:कपड़े के लिए अकेले fabfile?

from fabric.api import run 

def host_type(): 
    run('uname -s') 

if __name__ == '__main__': 
    host_type()  

उत्तर

13

मुझे अंत में समाधान मिला (और यह वास्तव में सरल है!)।
मेरी fabfile में, मैं कहा:

from fabric.main import main 

if __name__ == '__main__': 
    import sys 
    sys.argv = ['fab', '-f', __file__, 'update_server'] 
    main() 

मुझे आशा है कि यह लोगों को मदद मिलती ...

+0

क्या यह मुक्सी के समाधान की तरह एक उपप्रजाति पैदा करता है? मुख्य कारण यह है कि मैं इस मुद्दे की खोज कर रहा था अतिरिक्त उपप्रोसेस कुछ ऐसा है जिसे हम खत्म करना चाहते हैं। –

+1

यदि आप अपने sys.argv असाइनमेंट को बदलते हैं तो यह किसी भी प्रकार के कमांड के साथ काम करेगा। sys.argv [0] पहले से ही स्क्रिप्ट नाम है, इसलिए: sys.argv = ['fab', '-f'] + sys.argv – mqsoh

+0

यह तब तक काम कर रहा है जब फ़ाइल में '.py' एक्सटेंशन है। मुझे अभी तक किसी भी एक्सटेंशन के लिए काम करने का कोई रास्ता नहीं मिला। – Wernight

2

यह वास्तव में एक अच्छा समाधान नहीं है, लेकिन काम करेगा:

import subprocess 

def hello(): 
    print 'Hello' 

if __name__ == '__main__': 
    subprocess.call(['fab', '-f', __file__, 'hello']) 
+0

हाँ, वास्तव में अच्छा नहीं है (लेकिन बहुत मूल +1!)। साथ ही, stdio को संबोधित नहीं करता है (उदा। पासवर्ड के लिए इंटरैक्टिव प्रॉम्प्ट (जो मुझे लगता है हल करने योग्य है))। –

+0

शीर्ष टिप्पणी को अपहृत करने के लिए कहें कि कपड़े के नवीनतम संस्करणों में आप 'subprocess.call' की बजाय' execute' कमांड का उपयोग कर सकते हैं http://fabric.readthedocs.org/en/1.4.3/usage/execution.html# निष्पादित । – tutuca

3

अगर मैं सही ढंग से याद है, मैं क्या मैं या तो चाहते थे करने के कपड़ा एपीआई नहीं मिल सका।

import os 
import paramiko 

ssh = paramiko.SSHClient() 
ssh.load_system_host_keys() 
ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('hostname.example.com', 22, 'username', 'password') 
ssh.save_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 
stdin, stdout, stderr = ssh.exec_command('uname -s') 
print stdout.read() 

जबकि वहाँ शामिल कुछ और चरण, यह कर रहे हैं इस तरह से आप SSH परत लाभ उठाने के लिए सीधे अनुमति देता है: मैं पूरी तरह से अतिरिक्त परत का परित्याग और Paramiko (कपड़ा द्वारा इस्तेमाल किया अंतर्निहित SSH पुस्तकालय) सीधे उपयोग करने का फैसला , subprocess का उपयोग करने के लिए एक और पायथन उदाहरण स्पैन करने के लिए, या फैब्रिक एपीआई का पता लगाने के विरोध में। मेरे पास कई परियोजनाएं हैं, दोनों वेब- और कंसोल- इस तरह से परमिको का उपयोग करके और मुझे बहुत अधिक परेशानी नहीं हुई है।

पैरामीको extensively documented है।

+0

अफसोस की बात है, यह मेरे लिए सबसे अच्छा जवाब है। धन्यवाद! –

2

मैं ठीक argv तर्क के माध्यम से पिछले करने के लिए ऊपर के उदाहरण देखते आप स्थानीय आदेशों को पारित और एक निर्दिष्ट करने के लिए चाहते हो सकता है एक हार्ड कोडित कमांड नाम के बजाय वैकल्पिक default_commands सूची। नोट, फ़ाइल नाम में एक .py एक्सटेंशन होना चाहिए या फैब इसे एक fab फ़ाइल के रूप में नहीं पहचान पाएगा!

#!/usr/bin/env python 
from fabric.api import local 

default_commands = ['hello', ] 

def hello(): 
    print ('hello world') 

def hostname(): 
    local('hostname') 

if __name__ == '__main__': 
    import sys 
    from fabric.main import main 
    sys.argv = ['fab', '-f', __file__,] + default_commands + sys.argv[1:] 
    main() 
2

docs.fabfile.org/en/1.4.0/usage/library.html

"उस अनुभाग का उल्लेख के रूप में, कुंजी बस उस रन sudo है और अन्य संचालन केवल में देखो कनेक्ट करते समय एक स्थान: env.host_string। सभी होस्ट्स को सेट करने के लिए अन्य तंत्रों को फ़ैब टूल द्वारा चलाया जाता है, और लाइब्रेरी के रूप में चलते समय कोई फर्क नहीं पड़ता। "

मुझे यह समस्या तब मिल रही थी जब मुझे यह मिला। साथ ही, मुझे लगता है कि मुझे याद है कि जब एक fabfile में इस्तेमाल किया जाता है, env परिवर्तन एक ही def में चलाने के रूप में नहीं होना चाहिए, सूडो। कौन जानता है कि यह अभी भी लागू होता है जब "लाइब्रेरी" मोड में उपयोग किया जाता है।

संपादित करें: यहाँ का एक उदाहरण कहा कार्यान्वयन

from fabric.api import env, run 

def main(): 
    run("uname -a") 

def setup(): 
    env.host_string = "[email protected]" 

if __name__ == '__main__': 
    setup() 
    main() 
2
# thanks to aaron, extending his code a little more 
# here is a little bit more of a graceful solution than running subprocess.call, and specifying multiple hosts 

from fabric.api import env, run 

def main(): 
    run("uname -a") 

def setup(): 
    env.hosts = ['host0','host1'] 

if __name__ == '__main__': 
    setup() 
    for host in env.hosts: 
     env.host_string = host 
     main() 
1

अपने फैब फ़ाइल की तह तक इस जोड़े है।

if __name__ == '__main__': 
    from fabric.main import main 
    import sys 

    sys.argv = ['fab', '-f', __file__] + sys.argv[1:] 

    main() 
2

1.5.0 चूंकि argv के साथ चारों ओर खिलवाड़ से यह करने के लिए एक तरह से बेहतर तरीका है।

import fabric.main 

def main(): 
    fabric.main.main(fabfile_locations=[__file__]) 

if __name__ == "__main__": 
    main() 

यह भी setup.py

0

में एक सांत्वना स्क्रिप्ट के रूप में उपयोग किया जा सकता है कि बजाय कपड़े विकल्पों में से टन लिस्टिंग के उपलब्ध आदेशों को दिखाने के लिए डिफ़ॉल्ट व्यवहार में परिवर्तन Greg's answer की मेरी संशोधित संस्करण है।

if __name__ == '__main__': 
    # imports for standalone mode only 
    import sys, fabric.main 

    # show available commands by default 
    if not sys.argv[1:]: 
     sys.argv.append('--list') 

    fabric.main.main(fabfile_locations=[__file__]) 
0

मैं run fabric file renamed other than fabfile.py and password-less ssh

def deploy(): 
    ... 

if __name__ == '__main__': 
    from fabric import execute 
    execute(deploy) 

इस रास्ते पर परोक्ष रूप से समाधान नहीं मिला है, तो आपकी फ़ाइल .py एक्सटेंशन नहीं है भी काम करते हैं।

संबंधित मुद्दे