sys.argv [1] स्क्रिप्ट में अर्थ


146

मैं वर्तमान में अपने आप को पायथन सिखा रहा हूं और बस सोच रहा था (नीचे मेरे उदाहरण के संदर्भ में) सरल शब्दों में क्या sys.argv[1]प्रतिनिधित्व करता है। क्या यह केवल एक इनपुट के लिए पूछ रहा है?

#!/usr/bin/python3.1

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
  print ('Hello there', sys.argv[1])
  # Command line args are in sys.argv[1], sys.argv[2] ..
  # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
  main()

2
यह प्रश्न का हिस्सा नहीं है, और यह बहुत पुराना है लेकिन मॉड्यूल argparse , शायद के अनुसार, तुम क्या करने कोशिश कर रहे हैं के लिए बेहतर है इस
llrs

जवाबों:


334

मैं यह नोट करना चाहूंगा कि पिछले उत्तरों ने उपयोगकर्ता के ज्ञान के बारे में कई धारणाएं बनाई थीं। यह उत्तर प्रश्न को अधिक ट्यूटोरियल स्तर पर उत्तर देने का प्रयास करता है।

पायथन के हर आह्वान के लिए, sys.argvस्वचालित रूप से कमांड-लाइन पर तर्कों (रिक्त स्थान द्वारा अलग किए गए) का प्रतिनिधित्व करने वाले तार की एक सूची है। नाम सी प्रोग्रामिंग सम्मेलन से आता है से आया है जिसमें argv और argc कमांड लाइन तर्कों का प्रतिनिधित्व करते हैं।

आप लिस्ट और स्ट्रिंग्स के बारे में अधिक जानना चाहते हैं, जैसा कि आप पायथन के साथ खुद को परिचित कर रहे हैं, लेकिन इस बीच, यहां कुछ चीजें जानने योग्य हैं।

आप बस एक स्क्रिप्ट बना सकते हैं जो तर्कों का प्रतिनिधित्व करते हुए प्रिंट करता है। यह lenसूची पर फ़ंक्शन का उपयोग करते हुए, तर्कों की संख्या भी प्रिंट करता है ।

from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))

स्क्रिप्ट को 2.6 या बाद के पायथन की आवश्यकता है। यदि आप इस स्क्रिप्ट को कॉल करते हैं print_args.py, तो आप इसे विभिन्न तर्कों के साथ देख सकते हैं कि क्या होता है।

> python print_args.py
['print_args.py'] 1

> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4

> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2

> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4

जैसा कि आप देख सकते हैं, कमांड-लाइन तर्कों में स्क्रिप्ट नाम शामिल है लेकिन दुभाषिया नाम नहीं। इस अर्थ में, पायथन स्क्रिप्ट को निष्पादन योग्य मानता है । यदि आपको निष्पादन योग्य (इस मामले में अजगर) का नाम जानने की आवश्यकता है, तो आप उपयोग कर सकते हैं sys.executable

आप उन उदाहरणों से देख सकते हैं कि उन तर्कों को प्राप्त करना संभव है जिनमें रिक्त स्थान होते हैं यदि उपयोगकर्ता ने उद्धरणों में संलग्न तर्कों के साथ स्क्रिप्ट को आमंत्रित किया है, तो आपको जो मिलता है वह तर्कों की सूची है जैसा कि उपयोगकर्ता द्वारा आपूर्ति की गई है।

अब आपके पायथन कोड में, आप अपने प्रोग्राम में इनपुट के रूप में स्ट्रिंग्स की इस सूची का उपयोग कर सकते हैं। चूंकि सूचियाँ शून्य-आधारित पूर्णांकों द्वारा अनुक्रमित की जाती हैं, आप सूची [0] सिंटैक्स का उपयोग करके अलग-अलग आइटम प्राप्त कर सकते हैं। उदाहरण के लिए, स्क्रिप्ट नाम पाने के लिए:

script_name = sys.argv[0] # this will always work.

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

filename = sys.argv[1]

यह एक बहुत ही सामान्य उपयोग है, लेकिन ध्यान दें कि यह एक IndexError के साथ विफल हो जाएगा यदि कोई तर्क नहीं दिया गया था।

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

user_args = sys.argv[1:] # get everything after the script name

इसके अतिरिक्त, पायथन आपको चर नामों के लिए आइटम का एक क्रम (सूचियों सहित) असाइन करने की अनुमति देता है। इसलिए यदि आप उपयोगकर्ता से हमेशा दो तर्कों की आपूर्ति करने की अपेक्षा करते हैं, तो आप उन तर्कों (जैसे तार) को दो चर में निर्दिष्ट कर सकते हैं:

user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2

इसलिए, आपके विशिष्ट प्रश्न का उत्तर देने के लिए, प्रश्न में स्क्रिप्ट को दिए sys.argv[1]गए पहले कमांड-लाइन तर्क (ए string) के रूप में प्रतिनिधित्व करता है । यह इनपुट के लिए संकेत नहीं देगा, लेकिन यह इंडेक्सइर्र के साथ विफल होगा यदि स्क्रिप्ट नाम के बाद कमांड-लाइन पर कोई तर्क नहीं दिया जाता है।


1
जब आप स्ट्रिंग्स की सूची दिखाते हैं sys.argv, तो मुझे आश्चर्य होता है कि रेखा क्या करती from __future__ import print_functionहै। यह कुछ मैं अगर मैं कर रहा हूँ जोड़ना होगा है नहीं अजगर 3 लेकिन अजगर 2 पर चल रहा है? @ जैसन आर। कोम्ब्स
निकोलस

1
@ निचलोलू, आपको इसे जोड़ने की ज़रूरत नहीं है यदि आप पायथन 3 पर हैं। मैंने इसे पूर्णता के लिए जोड़ा है। पायथन 2 पर इसके बिना चलने की कोशिश करें और मेरे द्वारा बताए गए परिणामों की तुलना में आपको अलग-अलग परिणाम मिलेंगे। कोशिश करो।
जेसन आर। कोम्ब्स

@ JasonR.Cbs मैं इस एक के साथ भ्रमित हूँ sys.argv **is** automatically a list of strings:। क्या आपका मतलब है "देता है" या "वापसी"?
जिंसावे

1
@ गिल्यूम: यह एक सूक्ष्म शब्दार्थ भेद है, लेकिन पायथन में, sys.argv जैसे नाम वस्तुओं के संदर्भ में हैं। तो तकनीकी argvरूप से, sysमॉड्यूल की विशेषता एक सूची ऑब्जेक्ट का संदर्भ है जिसमें तर्कों के तार होते हैं। उपयोग करने के लिए givesया returnsएक समारोह आह्वान या जनरेटर या किसी अन्य निर्माण का सुझाव देगा। referencesया representsअधिक सटीक शब्द हो सकते हैं, लेकिन isयह काफी करीब है।
जेसन आर। कोम्ब्स

@ JasonR.Coombs क्या होता है अगर मैं सीधे mainमॉड्यूल आयात करके कहता हूं (बता दें कि मॉड्यूल नाम है moduleA.py) और फ़ंक्शन को इसमें कॉल करें import moduleA; moduleA.main()। उस मामले में, कोई कमांड-लाइन तर्क नहीं है .. इसलिए sys.argv[0]अभी भी filenameयानी का प्रतिनिधित्व करना चाहिए । यह प्रिंट होना चाहिए moduleA.py?
अल्फा_989

34

sys.argv [1] में आपकी स्क्रिप्ट में दिया गया पहला कमांड लाइन तर्क है

उदाहरण के लिए, यदि आपकी स्क्रिप्ट का नाम है hello.pyऔर आप जारी करते हैं:

$ python3.1 hello.py foo

या:

$ chmod +x hello.py  # make script executable
$ ./hello.py foo

आपकी स्क्रिप्ट छपेगी:

नमस्ते वहाँ फू

मुझे इस कमांड को चलाना है: py C: \\ प्रोजेक्ट-ओपन \\ सर्वर \\ प्रोजोप \\ पैकेज \\ इंट्रानेट-टाइमशीट 2 \\ www \\ घंटे \\ y.py अजगर फ़ाइल?
यक्ष

25

sys.argv एक सूची है।

यह सूची आपकी कमांड लाइन द्वारा बनाई गई है, यह आपके कमांड लाइन के तर्कों की एक सूची है।

उदाहरण के लिए:

अपनी कमांड लाइन में आप कुछ इस तरह से इनपुट करते हैं,

python3.2 file.py something

sys.argv एक सूची बन जाएगी ['file.py', 'something']

इस मामले में sys.argv[1] = 'something'


12

उदाहरण के लिए, यदि आप अपनी लिपि को फ्रेडरिक के उत्तर में जोड़ रहे हैं, तो इस प्रकार है:

./myscript.py foo bar

sys.argv[0] "//yscript.py "होगा sys.argv[1] होगा "foo" और sys.argv[2]आगे होगा "बार" ... और आगे।

आपके उदाहरण कोड में, यदि आप स्क्रिप्ट को निम्नानुसार कहते हैं ./myscript.py foo , तो स्क्रिप्ट का आउटपुट "हैलो वहाँ फू" होगा।


9

जेसन के उत्तर में कुछ और अंक जोड़ना:

प्रदान किए गए सभी उपयोगकर्ताओं के लिए तर्क: user_args = sys.argv[1:]

Sys.argv को स्ट्रिंग्स की सूची के रूप में (जेसन द्वारा उल्लिखित) पर विचार करें। तो सभी सूची जोड़तोड़ यहां लागू होंगे। इसे "सूची स्लाइसिंग" कहा जाता है। अधिक जानकारी के लिए यहां जाएं

वाक्य रचना इस प्रकार है: सूची [प्रारंभ: अंत: चरण]। यदि आप प्रारंभ करना छोड़ देते हैं, तो यह 0 पर डिफ़ॉल्ट हो जाएगा, और यदि आप समाप्त हो जाते हैं, तो यह सूची की लंबाई के लिए डिफ़ॉल्ट होगा।

मान लीजिए कि आप केवल 3 तर्क के बाद सभी तर्क लेना चाहते हैं, तो:

user_args = sys.argv[3:]

मान लीजिए कि आप केवल पहले दो तर्क चाहते हैं, फिर:

user_args = sys.argv[0:2]  or  user_args = sys.argv[:2]

मान लें कि आप तर्क 2 से 4 चाहते हैं:

user_args = sys.argv[2:4]

मान लें कि आप अंतिम तर्क चाहते हैं (अंतिम तर्क हमेशा -1 है, इसलिए यहां जो हो रहा है, हम गिनती को पीछे से शुरू कर रहे हैं। इसलिए शुरुआत अंतिम है, कोई अंत नहीं, कोई कदम नहीं):

user_args = sys.argv[-1]

मान लीजिए कि आप दूसरा अंतिम तर्क चाहते हैं:

user_args = sys.argv[-2]

मान लीजिए कि आप अंतिम दो तर्क चाहते हैं:

user_args = sys.argv[-2:]

मान लीजिए कि आप अंतिम दो तर्क चाहते हैं। यहां, प्रारंभ -2 है, जो कि अंतिम अंतिम आइटम है और फिर अंत तक (":") द्वारा चिह्नित किया गया है:

user_args = sys.argv[-2:]

मान लीजिए कि आप पिछले दो तर्कों को छोड़कर सब कुछ चाहते हैं। यहां, प्रारंभ 0 है (डिफ़ॉल्ट रूप से), और अंत दूसरा अंतिम आइटम है:

user_args = sys.argv[:-2]

मान लीजिए कि आप उल्टे क्रम में तर्क चाहते हैं:

user_args = sys.argv[::-1]

उम्मीद है की यह मदद करेगा।


4

sys.argv एक सूची है जिसमें स्क्रिप्ट पथ और कमांड लाइन तर्क हैं; यानी sys.argv [0] उस स्क्रिप्ट का पथ है जिसे आप चला रहे हैं और निम्नलिखित सभी सदस्य तर्क हैं।


3

कमांड लाइन के माध्यम से एक स्क्रिप्ट चलाने के दौरान अपने अजगर स्क्रिप्ट में तर्क पारित करने के लिए

python create_thumbnail.py test1.jpg test2.jpg

यहाँ, स्क्रिप्ट नाम - create_thumbnail.py, तर्क 1 - test1.jpg, तर्क 2 - test2.jpg

साथ मैं create_thumbnail.py स्क्रिप्ट का उपयोग करता हूं

sys.argv[1:]

जो मुझे कमांड लाइन में दिए गए तर्कों की सूची ['test1.jpg', 'test2.jpg']


1

sys.argvsysमॉड्यूल की एक विशेषता है । यह कहता है कि कमांड लाइन में फाइल में दिए गए तर्क। sys.argv[0]उस निर्देशिका को पकड़ता है जहाँ फ़ाइल स्थित है। sys.argv[1]कमांड लाइन में पारित पहला तर्क देता है। ऐसा समझें कि हमारे पास एक उदाहरण है फ़ाइल।

example.py

import sys # Importing the main sys module to catch the arguments
print(sys.argv[1]) # Printing the first argument

अब यहाँ कमांड प्रॉम्प्ट में जब हम ऐसा करते हैं:

python example.py

यह एक इंडेक्स त्रुटि को लाइन 2 पर फेंक देगा। क्योंकि अभी तक कोई तर्क पारित नहीं हुआ है। आप उपयोगकर्ता द्वारा उपयोग किए गए तर्कों की लंबाई देख सकते हैं if len(sys.argv) >= 1: # Code। यदि हम एक तर्क पास करने के साथ example.py चलाते हैं

python example.py args

यह प्रिंट करता है:

args

क्योंकि यह पहली बहस थी! मान लें कि हमने PyInstaller का उपयोग करके इसे एक निष्पादन योग्य फ़ाइल बनाया है। हम यह करेंगे:

example argumentpassed

यह प्रिंट करता है:

argumentpassed

जब आप टर्मिनल में कमांड बना रहे होते हैं तो यह वास्तव में मददगार होता है। पहले तर्कों की लंबाई की जाँच करें। यदि कोई तर्क पारित नहीं हुआ, तो सहायता पाठ करें।


0

sys .argv स्क्रिप्ट चलाते समय पास की गई कमांड लाइन के आर्ग को प्रदर्शित करेगा या आप कह सकते हैं कि sys.argv टर्मिनल से चलते समय अजगर में पारित कमांड लाइन के तर्कों को संग्रहीत करेगा।

बस यह प्रयास करें:

import sys
print sys.argv

pgthon सूची में दिए गए सभी तर्कों को argv संग्रहीत करता है। ऊपर दी गई सभी दलीलें स्क्रिप्ट को चलाएगी।

अब इसे इस तरह से अपना फ़ाइलनाम भेजने का प्रयास करें:

python filename.py example example1

यह एक सूची में 3 तर्क मुद्रित करेगा।

sys.argv[0] #is the first argument passed, which is basically the filename. 

इसी तरह, argv 1 पहला तर्क है, इस मामले में 'उदाहरण'

इसी तरह का सवाल यहां पहले से ही पूछा गया है । उम्मीद है की यह मदद करेगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.