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কমান্ড-লাইনে আর্গুমেন্টগুলি (স্পেস দ্বারা পৃথক পৃথক) উপস্থাপন করা স্ট্রিংগুলির একটি তালিকা স্বয়ংক্রিয়ভাবে দেওয়া হয়। নামটি সি প্রোগ্রামিং কনভেনশন থেকে আসে যার মধ্যে আরজিভি এবং আরজিসি কমান্ড লাইনের যুক্তি উপস্থাপন করে।

আপনি পাইথনের সাথে পরিচিত হওয়ায় আপনি তালিকাগুলি এবং স্ট্রিংগুলি সম্পর্কে আরও জানতে চাইবেন, তবে এর মধ্যে, কয়েকটি জিনিস জানতে হবে।

আপনি কেবল একটি স্ক্রিপ্ট তৈরি করতে পারেন যা উপস্থাপন করার সাথে সাথে আর্গুমেন্টগুলি মুদ্রণ করে। এটি lenতালিকায় ফাংশনটি ব্যবহার করে আর্গুমেন্টের সংখ্যাও মুদ্রণ করে ।

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

স্ক্রিপ্টটির জন্য পাইথন ২.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]

এটি একটি খুব সাধারণ ব্যবহার, তবে মনে রাখবেন যে কোনও যুক্তি সরবরাহ না করা থাকলে এটি একটি সূচিপত্রের সাথে ব্যর্থ হবে।

এছাড়াও, পাইথন আপনাকে তালিকার একটি স্লাইস রেফারেন্স করতে দেয়, যাতে কেবল ব্যবহারকারী-সরবরাহিত আর্গুমেন্টের (তবে স্ক্রিপ্টের নাম ছাড়াই) অন্য একটি তালিকা পেতে , আপনি এটি করতে পারেন

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
@ নিকোলাসলিউ, আপনি পাইথন ৩ এ থাকলে আপনাকে এটি যুক্ত করার দরকার নেই I আমি এটি সম্পূর্ণতার জন্য যুক্ত করেছি। পাইথন 2 এ ছাড়া চালানোর চেষ্টা করুন এবং আমি বর্ণিত হিসাবে আপনি আলাদা ফলাফল পাবেন। একবার চেষ্টা করে দেখো.
জেসন আর। কমস

@ JasonR.Coombs আমি এই এক সঙ্গে দ্বিধায় পরে আছি: sys.argv **is** automatically a list of strings। আপনার অর্থ "দেয়" বা "ফেরত"?
জিনস্নু

1
@ গুইলাউম: এটি একটি সূক্ষ্ম অর্থপূর্ণ পার্থক্য, কিন্তু পাইথনে, sys.argv এর মতো নামগুলি বস্তুর উল্লেখ রয়েছে। প্রযুক্তিগতভাবে, মডিউলটির argvবৈশিষ্ট্যটি sysআর্গুমেন্টের স্ট্রিংগুলি অন্তর্ভুক্ত একটি তালিকা অবজেক্টের একটি রেফারেন্স। কোনও ফাংশন আমন্ত্রণ বা জেনারেটর বা অন্য কোনও নির্মাণ ব্যবহার givesবা returnsপরামর্শ দেওয়ার জন্য। referencesবা representsআরও সুনির্দিষ্ট শর্ত হতে পারে, তবে isযথেষ্ট কাছাকাছি is
জেসন আর। কুম্বস

@ জেসনআর. যদি আমি সরাসরি mainমডিউলটি আমদানি করে কল করি (মডিউলটির নামটি বলা যাক moduleA.py) এবং ফাংশনটিকে যেমন কল করে তবে কী হবে তা চূড়ান্ত করে import moduleA; moduleA.main()। সেক্ষেত্রে কোনও কমান্ড-লাইন আর্গুমেন্ট নেই .. সুতরাং sys.argv[0]এখনও এর প্রতিনিধিত্ব করার কথা filename। এটা কি প্রিন্ট করা উচিত moduleA.py?
alpha_989

34

sys.argv [1] এ আপনার স্ক্রিপ্টে পাস হওয়া প্রথম কমান্ড লাইন যুক্তি রয়েছে ।

উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টটির নাম দেওয়া হয় hello.pyএবং আপনি ইস্যু করেন:

y পাইথন 3.1 হ্যালো.পি ফু

বা:

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

আপনার স্ক্রিপ্ট মুদ্রণ করা হবে:

হ্যালো ওখানে ফু

আমাকে এই কমান্ডটি চালাতে হবে: এক্সিকিউটি পাই সি: \\ প্রজেক্ট-ওপেন \\ সার্ভারস \\ প্রজপ \\ প্যাকেজগুলি \\ ইন্ট্রনেট-টাইমশিট 2 2 www \\ ঘন্টা \\ y.py এর জন্য আপেক্ষিক পথটি ব্যবহার করার কোনও উপায় আছে? অজগর ফাইল?
ইয়াকশ

25

sys.argv একটি তালিকা।

এই তালিকাটি আপনার কমান্ড লাইন দ্বারা তৈরি করা হয়েছে, এটি আপনার কমান্ড লাইন আর্গুমেন্টের একটি তালিকা।

উদাহরণ স্বরূপ:

আপনার কমান্ড লাইনে আপনি এমন কিছু ইনপুট করেন,

python3.2 file.py something

sys.argv একটি তালিকাতে পরিণত হবে ['file.py', 'কিছু']

এক্ষেত্রে sys.argv[1] = 'something'


12

ফ্রেডেরিকের উত্তরে কেবল যুক্ত করা, উদাহরণস্বরূপ আপনি যদি আপনার স্ক্রিপ্টটি নীচে কল করেন:

./myscript.py foo bar

sys.argv[0]"./myscript.py" sys.argv[1]হবে "foo" এবং sys.argv[2]"বার" হবে ... এবং আরও অনেক কিছু।

আপনার উদাহরণ কোডে, আপনি যদি স্ক্রিপ্টটিকে নিম্নরূপে কল করেন ./myscript.py foo তবে স্ক্রিপ্টটির আউটপুট "হ্যালো সেখানে ফু" হবে।


9

জেসনের উত্তরে আরও কয়েকটি বিষয় যুক্ত করা:

সমস্ত ব্যবহারকারীর সরবরাহিত যুক্তি গ্রহণের জন্য: user_args = sys.argv[1:]

Sys.argv কে স্ট্রিংগুলির একটি তালিকা হিসাবে বিবেচনা করুন (জেসন দ্বারা উল্লিখিত)। সুতরাং সমস্ত তালিকা ম্যানিপুলেশন এখানে প্রয়োগ করা হবে। এটিকে "তালিকা স্লাইসিং" বলা হয়। আরও তথ্যের জন্য এখানে যান

সিনট্যাক্সটি এর মতো: তালিকা [শুরু: শেষ: পদক্ষেপ]। যদি আপনি শুরুটি বাদ দেন তবে এটি 0 এ ডিফল্ট হবে এবং আপনি শেষটি বাদ দিলে এটি ডিফল্ট তালিকার দৈর্ঘ্যে হবে।

মনে করুন আপনি কেবলমাত্র তৃতীয় যুক্তির পরে সমস্ত আর্গুমেন্ট নিতে চান তবে:

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, তাই এখানে যা ঘটছে তা আমরা পিছন থেকে গণনা শুরু করব So সুতরাং শুরুটি শেষ, শেষ নয়, কোনও পদক্ষেপ নয়):

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

কমান্ড লাইনের মাধ্যমে স্ক্রিপ্ট চালানোর সময় আপনার অজগর স্ক্রিপ্টে যুক্তিগুলি সরবরাহ করতে

পাইথন 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]কমান্ড লাইনে পাস হওয়া প্রথম তর্কটি প্রদান করে। মনে করুন আমাদের কাছে একটি উদাহরণ আছে। পিপি ফাইল আছে py

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

কারণ এটি ছিল প্রথম তর্ক! ধরা যাক আমরা পাই পাইস্টলারের সাহায্যে এটি কার্যকর করার যোগ্য ফাইল হিসাবে তৈরি করেছি। আমরা এটি করব:

example argumentpassed

এটি প্রিন্ট করে:

argumentpassed

আপনি টার্মিনালে একটি কমান্ড তৈরি করার সময় এটি সত্যিই সহায়ক। প্রথমে যুক্তিগুলির দৈর্ঘ্য পরীক্ষা করুন check যদি কোনও যুক্তি পাস না হয় তবে সহায়তা পাঠ্য করুন।


0

sys .argv স্ক্রিপ্ট চলাকালীন কমান্ড লাইন আরোগুলি প্রদর্শন করবে বা আপনি বলতে পারবেন sys.argv টার্মিনাল থেকে চলার সময় পাইথনে পাস হওয়া কমান্ড লাইন আর্গুমেন্টগুলি সংরক্ষণ করবে।

শুধু এটি চেষ্টা করুন:

import sys
print sys.argv

আরজিভি অজগর তালিকায় পাস হওয়া সমস্ত যুক্তি সংরক্ষণ করে। উপরোক্ত সমস্ত আর্গুমেন্ট মুদ্রণ করবে স্ক্রিপ্ট চলমান।

এখন আপনার ফাইলের নামটি চালানোর চেষ্টা করুন।

python filename.py example example1

এটি একটি তালিকায় 3 টি আর্গুমেন্ট প্রিন্ট করবে।

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

একইভাবে, আরজিভি 1 প্রথম যুক্তিটি পাস হয়, এই ক্ষেত্রে 'উদাহরণ'

ইতিমধ্যে এখানে বিটিডব্লিউর অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছে । আশাকরি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.