2010-12-11 15 views
8

के साथ दर्ज सभी आदेशों को लपेटें जो मैं चाहता हूं वह एक तंत्र है जो बैश-टर्मिनल पर दर्ज सभी आदेशों को एक पायथन-स्क्रिप्ट द्वारा लपेटा जाता है। पायथन-स्क्रिप्ट दर्ज कमांड निष्पादित करता है, लेकिन यह कुछ अतिरिक्त जादू जोड़ता है (उदाहरण के लिए "गतिशील" वातावरण चर सेट करना)। क्या यह किसी भी तरह से संभव है?एक पायथन-स्क्रिप्ट के साथ एक पायथन-स्क्रिप्ट

मैं उबंटू और डेबियन स्क्वीजी चला रहा हूं।

अतिरिक्त व्याख्या:

मैं एक संपत्ति फाइल जो गतिशील रूप से बदलता है है (कुछ स्क्रिप्ट यह किसी भी समय बदल करते हैं)। मुझे अपनी फाइल की सभी स्क्रिप्ट स्क्रिप्ट्स में पर्यावरण चर के रूप में उस फ़ाइल से गुणों की आवश्यकता है। निस्संदेह मैं संपत्ति से फ़ाइल को किसी भी तरह से खोल सकता हूं, लेकिन मैं इसके लिए ऑब्जेक्ट उन्मुख शैली का उपयोग करना पसंद करता हूं (विशेष रूप से लेखन के लिए), क्योंकि इसे पायथन (और कॉन्फ़िगर ऑब्जेक्ट) के साथ किया जा सकता है।

इसलिए मैं अपनी सभी स्क्रिप्ट को उस पायथन स्क्रिप्ट के साथ लपेटना चाहता हूं (स्क्रिप्ट को स्वयं संशोधित किए बिना) जो इन गुणों को सभी शेल-स्क्रिप्ट पर नियंत्रित करता है। यह मेरा वर्तमान उपयोग मामला है, लेकिन मैं कल्पना कर सकता हूं कि मुझे अतिरिक्त मामले मिलेंगे जिन पर मैं अपना रैपर बाद में बढ़ा सकता हूं।

+0

क्या आप कृपया और विस्तारित कर सकते हैं कि आप क्या करना चाहते हैं? आप शैल कमांड को कैसे लपेटेंगे और आप उन्हें कैसे निष्पादित करने जा रहे हैं? यह दो (या शायद अधिक तरीकों से) में किया जा सकता है: ए) कमांड को स्ट्रिंग के रूप में संभाल लें, उस स्ट्रिंग में कुछ जोड़ें और उस स्ट्रिंग को बैश में चलाएं; बी) आदेश प्राप्त करें, 'subprocess' या किसी और चीज का उपयोग करके बैश निष्पादित करें और कमांड को पास करें (किसी अन्य कमांड से पहले)। – khachik

उत्तर

11

बैश शैल में टाइप किए गए प्रत्येक आदेश को लपेटने का सही तरीका है, तो आप पाइथन में सुंदर "सबप्रोसेस" मॉड्यूल का उपयोग कर सकते हैं। .bashrc के अंदर परिवर्तनीय PROMPT_COMMAND को बदलना है। उदाहरण के लिए, अगर मैं हर आदेश से पहले कुछ अजगर सामान करना चाहते हैं, मेरे सवाल में पूछा पसंद:

.bashrc:

# ... 
PROMPT_COMMAND="python mycoolscript.py; $PROMPT_COMMAND;" 
export $PROMPT_COMMAND 
# ... 

अब हर से पहले स्क्रिप्ट mycoolscript.py चलाया जाता है आदेश।

0

मैं कुछ भी लेकिन दो चीजें हैं जो मदद कर सकता है की नहीं जानते कि तुम

  1. http://sourceforge.net/projects/pyshint/
  2. IPython खोल iterpreter में खोल आदेश पर अमल करने के लिए कुछ कार्यक्षमता है का पालन करें।
+1

हाँ, मैं ipython जानता हूं, लेकिन मैं भी अपने मानक खोल py-ify करना चाहता हूं;) – ifischer

1

बैश के DEBUG जाल का उपयोग करें। अगर आपको विस्तार करने की ज़रूरत है तो मुझे बताएं।

संपादित करें:

यहाँ आप ऐसा करने में सक्षम हो सकता है चीजों के प्रकार के एक सरल उदाहरण है:

$ cat prefix.py 
#!/usr/bin/env python 
print "export prop1=foobar" 
print "export prop2=bazinga" 
$ cat propscript 
#!/bin/bash 
echo $prop1 
echo $prop2 
$ trap 'eval "$(prefix.py)"' DEBUG 
$ ./propscript 
foobar 
bazinga 

आप security risks of using eval के बारे में पता होना चाहिए।

+0

मैंने डीबग जाल के बारे में कुछ सामान पढ़ा, लेकिन मुझे अपनी "समस्या" – ifischer

+0

@ifischer के लिए इसका उपयोग करने का कोई तरीका नहीं मिला: आपका अजगर स्क्रिप्ट एक बच्चे के खोल के पर्यावरण को प्रभावित कर सकती है, लेकिन यह वर्तमान खोल के पर्यावरण को प्रभावित नहीं कर सकती है। आपको DEBUG जाल का उपयोग करके बैश में अपनी प्रसंस्करण करने की आवश्यकता होगी (संभवतः पाइथन कुछ प्रसंस्करण कर रहा है और परिणाम को बैश के लिए किसी स्ट्रिंग के रूप में परिणाम देने के लिए आउटपुट कर रहा है) या आपके उत्तर में किए गए रैपर का उपयोग करें। यदि आप जो कुछ हासिल करने की कोशिश कर रहे हैं उस पर अधिक विशिष्ट विवरण पोस्ट करते हैं, तो मैं अधिक मदद कर सकता हूं या आपको उपयोग करने के लिए एक अलग विधि पर निर्देशित कर सकता हूं। –

+0

यह ठीक है कि चर वर्तमान प्रवाह में प्रभावित नहीं हैं, जब तक कि मैं अपने x-script के साथ प्रत्येक कमांडो चलाता हूं। तो मैं अपने समाधान से बहुत संतुष्ट हूं, सिवाय इसके कि मुझे प्रत्येक कमांड से पहले x टाइप करना होगा (लेकिन अगर मैं इस तंत्र के बिना स्क्रिप्ट चलाने के लिए भी फायदे हैं तो इसका लाभ भी है)। मैंने अपने प्रश्न में मेरे उपयोग के मामले के बारे में कुछ अतिरिक्त स्पष्टीकरण दिए। मुझे बताएं कि क्या यह अभी स्पष्ट है। – ifischer

-2

कोई ऐसा प्रत्यक्ष तरीका नहीं है जिससे आप इसे कर सकें। लेकिन आप एक बैश टर्मिनल अनुकरण करने के लिए एक पायथन स्क्रिप्ट बना सकते हैं और आप

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