तर्क के साथ बैश से अजगर स्क्रिप्ट को बुलाओ


91

मुझे पता है कि मैं निम्नलिखित का उपयोग करके अपने बैश स्क्रिप्ट से एक पायथन स्क्रिप्ट चला सकता हूं:

python python_script.py

लेकिन क्या होगा अगर मैं अपनी बैश लिपि से अपनी पाइथन लिपि में एक चर / तर्क पारित करना चाहता था। मैं उसे कैसे कर सकता हूँ?

मूल रूप से बैश एक फ़ाइल नाम का काम करेगा और फिर अजगर इसे अपलोड करेगा, लेकिन मुझे कॉल करने पर इसे बैश से अजगर में फ़ाइल नाम भेजने की आवश्यकता है।


जब python python_script.pyडेबियन में अपने डिफ़ॉल्ट शेल में निष्पादित करें आप पहले से ही बैश का उपयोग कर रहे हैं ... तो बस अपनी बैश स्क्रिप्ट में करें:python python_script.py arg1 arg2 ...
Oz123

@ जिमी अनपढ़ प्रश्न मुझे लगता है, इसका बहुत आसान लिंक: tutorialspoint.com/python/python_command_line_arguments.htm
ब्रिजेश चौहान

जवाबों:


133

एक बैश स्क्रिप्ट में एक अजगर स्क्रिप्ट निष्पादित करने के लिए आपको उसी कमांड को कॉल करने की आवश्यकता है जिसे आप टर्मिनल के भीतर करेंगे। उदाहरण के लिए

> python python_script.py var1 var2

अजगर के भीतर इन चर का उपयोग करने के लिए आपको आवश्यकता होगी

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2

धन्यवाद। हालाँकि यह तरीका केवल एक उपयोग के मामले के लिए अजगर फ़ाइल को प्रतिबंधित करता है। क्या बैश स्क्रिप्ट के भीतर डायनामिक मापदंडों के साथ एक अजगर फ़ाइल के तरीकों को कॉल करने का एक तरीका है? इस तरह, हम एक ही अजगर फ़ाइल का उपयोग कर पाएंगे। मैंने कॉल स्क्रिप्ट के भीतर $ var के साथ कॉल अजगर विधियों के साथ ऐसा करने की कोशिश की। लेकिन यह किसी तरह विफल हो गया।
बर्कक

@burcak यदि आप डायनामिक पैरामीटर के आधार पर अजगर फ़ाइल को समानांतर रूप से निष्पादित करना चाहते हैं, तो पहले पूर्ण पथ का निर्माण करें << python script location path >> / << python script नाम >> param1 param2 | << pththon script location path >> / / << python script नाम >> bash script में param3 param4, फिर नीचे दिए गए python script के तर्क के रूप में आउटपुट पास करें, import sys import subprocess arg_str = "" .join (sys .argv [1:]) cmds = arg_str। cmd में cmd ​​के लिए विभाजन ('|'): प्रिंट ('कॉल -' + cmd) उपप्रोसेस ।open (cmd, shell = True) प्रिंट ('कॉल सेंट्स समाप्त')
थिरू

21

उपयोग

python python_script.py filename

और आपकी पायथन लिपि में

import sys
print sys.argv[1]

21

इसके अलावा sys.argv, argparse मॉड्यूल पर भी एक नज़र डालें , जो स्क्रिप्ट के लिए विकल्पों और तर्कों को परिभाषित करने में मदद करता है।

अर्ग्पर्स मॉड्यूल उपयोगकर्ता के अनुकूल कमांड-लाइन इंटरफेस लिखना आसान बनाता है।


मैं सहमत हूँ, मेरे लिए argparse sys.argv से बेहतर विकल्प है
Mo Ali

8

एंबेडेड विकल्प:

बश फ़ंक्शन में अजगर कोड लपेटें।

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

अपने एम्बेडेड अजगर स्क्रिप्ट में डेटा पास करने के लिए पर्यावरण चर का उपयोग करें।

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html


1

स्क्रिप्ट में उपयोग:

echo $(python python_script.py arg1 arg2) > /dev/null

या

python python_script.py "string arg"  > /dev/null

स्क्रिप्ट को आउटपुट के बिना निष्पादित किया जाएगा।


"स्ट्रिंग arg" को एक वैरिएबल से बदलना संभव है जो बैश से है?
कोडगुरू

1

मेरे पास एक बैश स्क्रिप्ट है जो एक संदेश विंडो प्रदर्शित करने के लिए एक छोटे अजगर दिनचर्या को बुलाती है। जैसा कि मुझे अजगर स्क्रिप्ट को रोकने के लिए किलॉल का उपयोग करने की आवश्यकता है मैं उपरोक्त विधि का उपयोग नहीं कर सकता क्योंकि इसका मतलब हत्यारे अजगर को चलाना होगा जो अन्य अजगर कार्यक्रमों को निकाल सकता है इसलिए मैं उपयोग करता हूं

pythonprog.py "$argument"& # द रिटर्न रिटर्न को सीधे बैश स्क्रिप्ट पर नियंत्रित करता है, इसलिए बैकटिक्स के बाहर होना चाहिए। इस संदेश का पूर्वावलोकन किसी कारण से कमांड के दोनों ओर "बिना" के दिखाई दे रहा है।

जब तक अजगर स्क्रिप्ट स्क्रिप्ट के भीतर काम करता है अजगर pythonprog.py बजाय बजाय नाम से cli से चलेगा। यदि आपको एक से अधिक तर्क की आवश्यकता है, तो बस उद्धरणों के भीतर प्रत्येक के बीच एक स्थान का उपयोग करें।


-1

और getopt मॉड्यूल पर एक नज़र डालें । यह मेरे लिए काफी अच्छा काम करता है!


getopt डॉक्स प्रारंभ: नोट: गेटटॉप मॉड्यूल कमांड लाइन विकल्पों के लिए एक पार्सर है जिसका एपीआई सी गेटटॉप () फ़ंक्शन के उपयोगकर्ताओं से परिचित होने के लिए डिज़ाइन किया गया है। जो उपयोगकर्ता C getopt () फ़ंक्शन से अपरिचित हैं या जो कम कोड लिखना चाहते हैं और बेहतर सहायता प्राप्त करते हैं और त्रुटि संदेशों के बजाय argparse मॉड्यूल का उपयोग करने पर विचार करना चाहिए।
cate
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.