2010-11-23 20 views
8

में चर को कैसे पास करें मेरे पास एक बैश स्क्रिप्ट है, a.sh, और इसमें मैंने एक पायथन स्क्रिप्ट b.py कहा है। पायथन स्क्रिप्ट कुछ की गणना करता है, और मैं इसे एक मान वापस करना चाहता हूं जिसका उपयोग बाद में a.sh में किया जाएगा। मैं जानता हूँ कि मैंपाइथन स्क्रिप्ट से बैश स्क्रिप्ट

कर सकते हैं a.sh में:

var=`python b.py` 

b.py में:

print x # when x is the value I want to pass 

लेकिन इस वजह से मैं भी ख में अन्य संदेशों प्रिंट, तो सुविधाजनक नहीं है। पीई

क्या ऐसा करने का कोई बेहतर तरीका है?

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

क्या मैं अब कर रहा हूँ बस

var=`python b.py | tail -n 1` 

है इसका मतलब है कि मैं b.py अंदर बहुत सी बातें मुद्रित कर सकते हैं, लेकिन केवल अंतिम पंक्ति (पिछले प्रिंट आदेश, यह मानते हुए कि इसमें "\ n" नहीं है) var में संग्रहीत किया जाएगा।

सभी उत्तरों के लिए धन्यवाद!

+1

ठीक है, शायद आप बैच स्क्रिप्ट के साथ शुरू करने के लिए _not_ कर सकते हैं - पाइथन से सबकुछ करें, जहां से डेटा और कोड के बीच विवाद हमेशा स्पष्ट होता है, आपको स्केलर वैल्यू पढ़ने के लिए बस एक नई प्रोसेसिंग नहीं करना पड़ता है ("बिल्ली" भालू का उपयोग कर उत्तरों की तरह), और इसी तरह। – jsbueno

उत्तर

7

मैं इसे कमांड लाइन पर चुनी गई फ़ाइल में प्रिंट करूंगा, तो मुझे cat जैसे कुछ के साथ बैश में वह मान मिल जाएगा।

तो तुम जाना चाहते हैं:

python b.py tempfile.txt 
var=`cat tempfile.txt` 
rm tempfile.txt 

[संपादित करें, एक और विचार अन्य उत्तर के आधार पर]

आपका दूसरा विकल्प अपने उत्पादन ध्यान से फ़ॉर्मेट करने के लिए ताकि आप head तरह बैश कार्यों का उपयोग कर सकते है/tail अपने अगले कार्यक्रम में केवल पहली/आखिरी पंक्तियों को पाइप करने के लिए।

+0

मुझे इसे मारो ;-) – Cameron

+0

:-) हालांकि मैं तर्क दूंगा कि यह बदसूरत नहीं है। फाइलों में जानकारी रखना बिल्कुल फाइलें हैं। यह किसी समस्या के बहु-प्रोग्राम समाधान में बहुत आसान डिबगिंग की अनुमति देता है। – Crisfole

+1

शायद "बदसूरत" बहुत मजबूत था ... मुझे लगता है कि फ़ाइलों को लंबे समय तक (एर) -टेर स्टोरेज डेटा के लिए और अधिक माना जाता है। डिस्क पर कुछ लिखना, फिर इसे सही ढंग से पढ़ना मिलिसेकंड्स को बाद में डेटा के चारों ओर गुज़रने के साधन के रूप में पढ़ना, जो कि एक ही प्रोग्राम मेरे लिए सुरुचिपूर्ण लगता है (निश्चित रूप से यह रैम के लिए है?)। फ़ाइल I/O करते समय लगभग 10 बिलियन चीजें गलत हो सकती हैं (हालांकि निष्पक्ष होने के लिए, आमतौर पर चीजें पूरी तरह से काम करती हैं)। दूसरी तरफ, यह काम करता है! (और अन्य विकल्प भी कम स्वादिष्ट (या अधिक जटिल) हैं - बैश में आईपीसी, कोई भी?) – Cameron

0

आप आउटपुट को अस्थायी फ़ाइल में लिख सकते हैं, और खोल को उस फ़ाइल को पढ़ और हटा सकते हैं। यह भी कम सुविधाजनक है, लेकिन उपयोगकर्ता के साथ संचार के लिए आरक्षित है।

वैकल्पिक रूप से, आप stdout के लिए किसी प्रकार के प्रारूप का उपयोग कर सकते हैं: पहली एन लाइनें कुछ चर हैं, शेष उपयोगकर्ता को पैरेंट खोल द्वारा प्रतिबिंबित किया जाएगा। यह भी सुविधाजनक नहीं है, लेकिन tempfiles का उपयोग से बचाता है।

1

मुझे "बेहतर" के बारे में निश्चित नहीं है, लेकिन आप परिणाम को एक फ़ाइल में लिख सकते हैं और इसे बैश में वापस पढ़ सकते हैं और बाद में इसे हटा सकते हैं।

यह निश्चित रूप से बदसूरत है, लेकिन यह कुछ भी नहीं है अगर चाल कुछ और नहीं करता है।

1

अपने अजगर स्क्रिप्ट में, stderr के लिए एक और संदेशों रीडायरेक्ट करने, और stdout में x प्रिंट:

import sys 
... 
print >>sys.stderr, "another message" 
print x 
बैश लिपि में

:

... 
var=`python b.py 2>/dev/null` 

इसके अलावा, अगर एक्स 0255 के बीच एक पूर्णांक है, आप इसे बाश में पास करने के लिए निकास कोड का उपयोग कर सकते हैं:

import sys 
... 
sys.exit(x) 

बैश में:

python b.py 
var=$? 

कृपया ध्यान दें कि त्रुटियों को इंगित करने के लिए निकास कोड का उपयोग किया जाता है, 0 का मतलब कोई त्रुटि नहीं है, और यह सम्मेलन को तोड़ देता है।

+0

यह मेरा दूसरा विचार था। मैंने तय किया कि फ़ाइलों को और अधिक 'सही' महसूस हुआ है कि अन्य संदेश सभी "त्रुटि" नहीं हैं - मैं ओपी से जो कुछ बता सकता हूं उसके आधार पर पर्याप्त है। – Crisfole

3

मेरा मानना ​​है कि इस सवाल का जवाब

.py

import sys 
a=['zero','one','two','three'] 
b = int(sys.argv[1]) 
###your python script can still print to stderr if it likes to 
print >> sys.stderr, "I am no converting" 
result = a[b] 
print result 

.sh

#!/bin/sh 

num=2 
text=`python numtotext.py $num` 
echo "$num as text is $text" 
1

बैश पर है backsticks works

मैं आमतौर पर करते कुछ की तरह

PIP_PATH=`python -c "from distutils.sysconfig \ 
import get_python_lib; print(get_python_lib())"` 


POWELINE_PATH=$PIP_PATH"/powerline" 
echo $POWELINE_PATH 
संबंधित मुद्दे