2011-09-22 23 views
7

आखिरकार मैं इसे समझता हूं और यह काम करता है।बैश वैरिएबल को पाइथन में कैसे पास किया जाए?

बैश स्क्रिप्ट:

#!/bin/bash 
#$ -V 
#$ -cwd 
#$ -o $HOME/sge_jobs_output/$JOB_ID.out -j y 
#$ -S /bin/bash 
#$ -l mem_free=4G 


c=$SGE_TASK_ID 
cd /home/xxx/scratch/test/ 
FILENAME=`head -$c testlist|tail -1` 
python testpython.py $FILENAME 

अजगर स्क्रिप्ट:

#!/bin/python 
import sys,os 


path='/home/xxx/scratch/test/' 
name1=sys.argv[1] 
job_id=os.path.join(path+name1) 
f=open(job_id,'r').readlines() 
print f[1] 

THX स्क्रिप्ट के

+0

'argparse' मॉड्यूल का कौन सा हिस्सा आपको भ्रमित करता है? http://docs.python.org/dev/library/argparse.html। यह आपके कोड के साथ होने वाली समस्या पर अधिक ** विशिष्ट ** प्रश्न पूछने में मदद करता है। कृपया 'argparse' का उपयोग करके कोड पोस्ट करें और विशिष्ट प्रश्न पूछें। –

+0

इसे कमांड लाइन पैरामीटर के रूप में पास करें और फिर इसे sys.argv से बाहर खींचें। – GreenMatt

उत्तर

12

बैश चर वास्तव में वातावरण चर रहे हैं। आप उन्हें एक शब्दकोश-जैसे इंटरफ़ेस के साथ os.environ ऑब्जेक्ट के माध्यम से प्राप्त करते हैं। ध्यान दें कि बैश में दो प्रकार के चर हैं: वर्तमान प्रक्रिया के लिए स्थानीय, और जो बच्चे प्रक्रियाओं द्वारा विरासत में हैं। आपकी पायथन लिपि एक बाल प्रक्रिया है, इसलिए आपको यह सुनिश्चित करने की ज़रूरत है कि आप export वैरिएबल चाहते हैं कि आप बाल प्रक्रिया को एक्सेस करना चाहते हैं।

अपने मूल प्रश्न का उत्तर देने के लिए, आपको पहले चर को निर्यात करने की आवश्यकता है और फिर इसे os.environ का उपयोग करके पायथन स्क्रिप्ट के भीतर से एक्सेस करना होगा।

##!/bin/bash 
#$ -V 
#$ -cwd 
#$ -o $HOME/sge_jobs_output/$JOB_ID.out -j y 
#$ -S /bin/bash 
#$ -l mem_free=4G 

c=$SGE_TASK_ID 
cd /home/xxx/scratch/test/ 
export FILENAME=`head -$c testlist|tail -1` 
chmod +X testpython.py 
./testpython.py 


#!/bin/python 
import sys 
import os 

for arg in sys.argv: 
    print arg 

f=open('/home/xxx/scratch/test/' + os.environ['FILENAME'],'r').readlines() 
print f[1] 

वैकल्पिक रूप से, आप चर को कमांड लाइन तर्क के रूप में पास कर सकते हैं, जो आपका कोड अब कर रहा है। उस स्थिति में, आपको sys.argv में देखना होगा, जो आपकी स्क्रिप्ट में दिए गए तर्कों की सूची है। वे उसी क्रम में sys.argv में दिखाई देते हैं, जिसे आपने स्क्रिप्ट का आह्वान करते समय निर्दिष्ट किया था। sys.argv[0] में हमेशा चल रहे प्रोग्राम का नाम शामिल है। बाद की प्रविष्टियों में अन्य तर्क होते हैं। len(sys.argv) स्क्रिप्ट प्राप्त तर्कों की संख्या इंगित करता है।

#!/bin/python 
import sys 
import os 

if len(sys.argv) < 2: 
    print 'Usage: ' + sys.argv[0] + ' <filename>' 
    sys.exit(1) 

print 'This is the name of the python script: ' + sys.argv[0] 
print 'This is the 1st argument:    ' + sys.argv[1] 

f=open('/home/xxx/scratch/test/' + sys.argv[1],'r').readlines() 
print f[1] 
0

कमांड लाइन तर्क sys.argv सूची के रूप में उपलब्ध हैं।

1

parsing Python arguments पर एक नज़र डालें। आपका बैश कोड ठीक होगा, तर्क लेने के लिए बस अपनी पायथन स्क्रिप्ट को संपादित करने की आवश्यकता है।

+0

क्षमा करें अभी भी उलझन में है ... क्या कोई भी पायथन कोड में sys.argv जोड़ सकता है? – user815408

+0

आपको 'आयात sys' जोड़ने और 'args [1] ' – aus

0

(हारून सुझाव प्रति संपादित) अपनी स्क्रिप्ट के अंदर इस प्रयोग:

def main(args): 
    do_something(args[0]) 


if __name__ == "__main__": 
    import sys 
    main(sys.argv[1:]) 
+0

' bool (sys.argv) 'जैसे कुछ का उपयोग करके तर्क स्वीकार करने के लिए पायथन स्क्रिप्ट को बदलना होगा, हमेशा' True' और 'sys.argv [0 ] 'में स्क्रिप्ट नाम होगा। – wRAR

+1

शत्रुओं को नफरत होगी, – MattoTodd

+1

को सही किया गया है यदि आप किसी फ़ंक्शन में तर्क पारित करने जा रहे हैं, तो स्क्रिप्ट नाम को काटना अधिक आम है, इसलिए फ़ंक्शन को अनदेखा करने की आवश्यकता नहीं है। यानी मुख्य (sys.argv [1:]) ' –

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