2010-09-07 11 views
8

के साथ पायथन 'स्रोत HOME/.bashrc' मैं एक पायथन स्क्रिप्ट (लिनक्स) लिख रहा हूं जो कुछ shell aliases जोड़ रहा है (उन्हें HOME/.bash_aliases पर लिखता है)।ओशनसिस्टम()

आदेश एक उपनाम तुरंत उपलब्ध होने के बाद यह लिखा गया था मैं निम्नलिखित बैश जारी करना चाहिए बनाने के लिए निर्मित:

source HOME/.bashrc 

source है एक पार्टी में निर्मित तो मैं बस नहीं कर सकते हैं:

os.system(source HOME/.bashrc) 
... (स्क्रिप्ट फ्रीज होगा

os.system('/bin/bash -c source HOME/.bashrc') 

:

तो मैं की तरह कुछ कोशिश बस कुछ की प्रतीक्षा कर रहा है)।

कोई सुझाव?

उत्तर

5

जो आप चाहते हैं वह संभव नहीं है। एक प्रोग्राम (आपकी स्क्रिप्ट) कॉलर के वातावरण को संशोधित नहीं कर सकता (वह शेल जिसे आप इसे चलाते हैं)।

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

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। समानांतर में मैंने कुछ शोध किया है, और हाँ, आप सही हैं, जो मैं चाहता हूं वह काफी संभव नहीं है। कामकाज एक बैश स्क्रिप्ट लिखना है और अगर यह आवश्यक है तो इसे चलाने के लिए है। लेकिन मैं सोच रहा था कि रनटाइम पर पर्यावरण को संशोधित करना खतरनाक हो सकता है, खासकर अगर सर्वर पहले से ही "गहन" स्क्रिप्ट चला रहा है। –

+0

@Andrei मैंने स्रोत करने के लिए एक बैश स्क्रिप्ट का उपयोग करने का प्रयास किया, लेकिन न तो काम किया। – peacepassion

3

जो आप करने की कोशिश कर रहे हैं वह असंभव है। या बेहतर: आप इसे करने की कोशिश कैसे कर रहे हैं असंभव है।

  1. आपका बैश कमांड गलत है। bash -s commandcommand निष्पादित नहीं करता है। यह सिर्फ $1 में स्ट्रिंग "कमांड" को संग्रहीत करता है और फिर आपको प्रॉम्प्ट पर छोड़ देता है। यही कारण है कि पाइथन लिपि स्थिर हो रही है। आप क्या करना चाहते हैं bash -c command है।

  2. आप .bashrc क्यों स्रोत करते हैं? क्या यह सिर्फ .bash_aliases स्रोत के लिए पर्याप्त नहीं होगा?

  3. भले ही आपको अपना बैश कमांड मिला हो, तो परिवर्तन केवल पायथन से शुरू होने वाले बैश सत्र में प्रभावी होंगे। एक बार जब बैश सत्र बंद हो जाता है, और आपकी पायथन लिपि पूरी हो जाती है, तो आप अपने मूल बैश सत्र पर वापस आ जाते हैं। पाइथन से शुरू किए गए बैश सत्र में सभी परिवर्तन खो गए हैं।

हर बार जब आप वर्तमान बैश सत्र में कुछ बदलना चाहते हैं, तो आपको इसे मौजूदा बैश सत्र के अंदर से करना होगा। आपके द्वारा बैश (सिस्टम कमांड, पायथन स्क्रिप्ट्स, यहां तक ​​कि बैश स्क्रिप्ट्स) से चलने वाले अधिकांश आदेश एक और प्रक्रिया को जन्म देंगे, और जो कुछ भी आप उस अन्य प्रक्रिया में करते हैं, वह आपके पहले बैश सत्र को प्रभावित नहीं करेगा।

source एक बैश बिल्टिन है जो आपको वर्तमान में चल रहे बैश सत्र के अंदर कमांड निष्पादित करने की अनुमति देता है, बजाय किसी अन्य प्रक्रिया को बढ़ाने और वहां कमांड चलाने के बजाए। एक बैश फ़ंक्शन को परिभाषित करना वर्तमान में चल रहे बैश सत्र के अंदर कमांड निष्पादित करने का एक और तरीका है।

सोर्सिंग और निष्पादन के बारे में अधिक जानकारी के लिए this answer देखें।

क्या आप को प्राप्त करने के लिए आप क्या

अपने अजगर स्क्रिप्ट को संशोधित चाहते हैं तो बस .bash_aliases के लिए आवश्यक परिवर्तन करने के लिए कर सकते हैं।

अपनी पायथन स्क्रिप्ट चलाने के लिए एक बैश स्क्रिप्ट तैयार करें और फिर स्रोत .bash_aliases

#i am a bash script, but you have to source me, do not execute me. 
modify_bash_aliases.py "[email protected]" 
source ~/.bash_aliases 

कि स्क्रिप्ट

alias add_alias='source modify_bash_aliases.sh' 
अब

स्रोत के लिए जब आप अपने बैश में add_alias some_alias टाइप का संकेत यह source modify_bash_aliases.sh से बदल दिया जाएगा और उसके बाद मार डाला अपने .bashrc उपनाम जोड़ना। चूंकि source एक बैश बिल्टिन है, इसलिए स्क्रिप्ट के अंदर के आदेश वर्तमान में चल रहे बैश सत्र के अंदर निष्पादित किए जाएंगे। पायथन स्क्रिप्ट अभी भी एक और प्रक्रिया में चलेगी, लेकिन बाद में source कमांड आपके वर्तमान चल रहे बैश सत्र के अंदर चलाएगा।

एक और तरीका

अपने अजगर स्क्रिप्ट को संशोधित सिर्फ .bash_aliases के लिए आवश्यक परिवर्तन करने के लिए।

अपनी पायथन स्क्रिप्ट चलाने के लिए एक बैश फ़ंक्शन तैयार करें और फिर .bash_aliases स्रोत बनाएं।

add_alias() { 
    modify_bash_aliases.py "[email protected]" 
    source ~/.bash_aliases  
} 

अब आप इस तरह फ़ंक्शन को कॉल कर सकते हैं: add_alias some_alias

0

[[काम कर समाधान]]

http://stackoverflow.com/questions/6856119/can-i-use-an-alias-to-execute-a-program-from-a-python-script

import subprocess 
sp = subprocess.Popen(["/bin/bash", "-i", "-c", "nuke -x scriptpath"]) 
sp.communicate() 
0

मैं एक दिलचस्प मुद्दा है जहाँ मैं करने के लिए आवश्यक था मेरी पायथन लिपि में सही आउटपुट प्राप्त करने के लिए एक आरसी फ़ाइल स्रोत।

अंत में मैंने स्रोत के लिए आवश्यक बैश फ़ाइल से वही चर लाने के लिए इसे अपने फ़ंक्शन के अंदर उपयोग किया। ओएस आयात किया जाना सुनिश्चित करें।

with open('overcloudrc') as data: 
    lines = data.readlines() 

for line in lines: 
    var = line.split(' ')[1].split('=')[0].strip() 
    val = line.split(' ')[1].split('=')[1].strip() 
    os.environ[var] = val