Os.getenv এবং os.en वातावरण.get এর মধ্যে পার্থক্য


159

উভয় পদ্ধতির মধ্যে কি কোনও পার্থক্য আছে?

>>> os.getenv('TERM')
'xterm'
>>> os.environ.get('TERM')
'xterm'

>>> os.getenv('FOOBAR', "not found") == "not found"
True
>>> os.environ.get('FOOBAR', "not found") == "not found"
True

তারা ঠিক একই কার্যকারিতা আছে বলে মনে হচ্ছে।

উত্তর:


60

একটি পার্থক্য পর্যবেক্ষণ (পাইথন 27):

os.environপরিবেশগত পরিবর্তনশীল না থাকলে একটি ব্যতিক্রম উত্থাপন করে। os.getenvএকটি ব্যতিক্রম উত্থাপন করে না, কিন্তু কিছুই প্রদান করে না


119
ওপি os.environ.get()কোন রিটার্ন সম্পর্কে জিজ্ঞাসা করে None(ভিন্নভাবে নির্দিষ্ট না করা হয়) এবং যদি enর্ষা করে তবে কখনই ব্যতিক্রম বাড়াবে না। Var। বিদ্যমান নেই আপনার বিভ্রান্তিকর জিনিসগুলি যা ব্যবহার করে os.environ['TERM']তা প্রশ্নটি নয়।
Anthon

2
ওপি এর প্রশ্ন সম্পর্কে জিজ্ঞেস os.environ.get()বনাম os.getenv()কিন্তু শরীর অন্তর্ভুক্ত os.environবনাম os.environ.get()তাই এই উত্তর অন্তত কিছু উপায় সঠিক - অসম্পূর্ণ, কিন্তু সঠিক।
এফকেইন্টারনেট

3
এই ভুল এবং বিভ্রান্তিমূলক উত্তরটি নেতিবাচক ডাউন ভোট প্রাপ্ত হওয়া উচিত ছিল। পরের উত্তরটি সঠিক।
রায়লুও

80

দেখুন এই সংশ্লিষ্ট থ্রেড । মূলত, os.environআমদানিতে পাওয়া যায় এবং os.getenvএটি os.environ.getঅন্তত সিপিথনে একটি মোড়ক ।

সম্পাদনা: সিপিথনে একটি মন্তব্যের প্রতিক্রিয়া জানাতে os.getenvমূলত এর শর্টকাট os.environ.get; যেহেতু os.environআমদানিতে লোড করা হয় os, এবং কেবল তখনই একইটির জন্য রয়েছে os.getenv


1
প্রকৃতপক্ষে, এটি সরকারী দস্তাবেজ অনুসারে: docs.python.org/3/library/os.html
ivanleoncz

1
লিঙ্কযুক্ত সম্পর্কিত থ্রেড থেকে: "ব্যবহারের মূল কারণ os.getenv()[...] হ'ল যখন আপনি একটি ডিফল্ট মানটি ফিরিয়ে আনতে চান যখন পরিবেশের চলক নামটি os.environকীগুলির মধ্যে পাওয়া যায় না KeyErrorযা একটি বা যা কিছু ফেলে দেওয়া থাকে, এবং আপনি কয়েকটি অক্ষর সংরক্ষণ করতে চান। "
মানসিকতা

35

পাইথন ২.7 এ আইপিথন সহ:

>>> import os
>>> os.getenv??
Signature: os.getenv(key, default=None)
Source:
def getenv(key, default=None):
    """Get an environment variable, return None if it doesn't exist.
    The optional second argument can specify an alternate default."""
    return environ.get(key, default)
File:      ~/venv/lib/python2.7/os.py
Type:      function

সুতরাং আমরা উপসংহার করতে পারেন os.getenv কেবল চারপাশে একটি সাধারণ মোড়ক os.environ.get


16

এবং এর মধ্যে কোনও কার্যকরী পার্থক্য না থাকলেও os.environ.getএবং এন্ট্রি স্থাপনের মধ্যে os.getenvএকটি বিশাল পার্থক্য রয়েছে । নষ্ট হয়ে গেছে , তাই আপনাকে প্রতিসাম্য ব্যবহারের জন্য উত্সাহিত করার উপায়টি এড়াতে আপনার ডিফল্ট হওয়া উচিত ।os.putenvos.environos.putenvos.environ.getos.getenvos.putenv

os.putenvপ্রকৃত ওএস-স্তরের বিভিন্ন পরিবেশের পরিবর্তন ঘটায়, কিন্তু একটি উপায় যে মাধ্যমে আপ প্রদর্শন করা হয় না os.getenv, os.environকিংবা বিভিন্ন পরিবেশের পরিদর্শন অন্য কোন stdlib উপায়:

>>> import os
>>> os.environ['asdf'] = 'fdsa'
>>> os.environ['asdf']
'fdsa'
>>> os.putenv('aaaa', 'bbbb')
>>> os.getenv('aaaa')
>>> os.environ.get('aaaa')

কল করার getenvপরে প্রকৃত পরিবেশের পরিবর্তনগুলি দেখতে আপনাকে সম্ভবত সি-লেভেলে একটি টাইপ কল করতে হবে os.putenv। (শেল সাবপ্রসেসটি চালু করা এবং তার পরিবেশের ভেরিয়েবলগুলির জন্য জিজ্ঞাসা করা খুব কার্যকর হতে পারে, যদি আপনি প্রারম্ভিক কনফিগারেশন এড়ানোর জন্য পালাতে এবং --norc/ --noprofile/ যে কোনও কিছু করতে আপনার প্রয়োজন হয় তবে এটি সঠিকভাবে পাওয়া খুব শক্ত মনে হয়))


2

উপরের উত্তরগুলি ছাড়াও:

$ python3 -m timeit -s 'import os' 'os.environ.get("TERM_PROGRAM")'
200000 loops, best of 5: 1.65 usec per loop

$ python3 -m timeit -s 'import os' 'os.getenv("TERM_PROGRAM")'
200000 loops, best of 5: 1.83 usec per loop

পাইথনের কোন সংস্করণ আপনি পরীক্ষা করেছেন। ৩..2.২-এ, os.getenvকেবল একটি র‍্যাপার os.environ.get, তাই আমি খুব কম ওভারহেড পাচ্ছি।
প্রেসলাভ রাচেভ

ম্যাকোস মোজভেভে এটি ছিল ৩. 3..১। সময়গুলি বেশ সামঞ্জস্যপূর্ণ ছিল।
ফ্রেডরিক

@ প্রেস্লাভরাচেভ ন্যূনতম বা না এটি একটি অতিরিক্ত ফাংশন কল, তাই কিছুটা ওভারহেড রয়েছে। বলা হচ্ছে, আপনার সম্ভবত আপনার অভ্যন্তরের লুপের মাঝখানে এনভ ভেরিয়েবলগুলি পুনরুদ্ধার করার দরকার নেই।
pmav99

7
সম্পূর্ণ অপ্রাসঙ্গিক। একটি একক ফাংশন কলটির মাইক্রো-অপ্টিমাইজেশন ... যে কোনও অ্যাপ্লিকেশনটির যে কোনও উপায়ে কেবল বুটস্ট্র্যাপে পরিবেশটি পড়তে হবে, এটি এটিকে আরও অপ্রাসঙ্গিক করে তোলে।
ভিক্টর শ্রড্ডার

1
BTW, usecএকটি হল মাইক্রোসেকেন্ড মধ্যে timeit। এই মাইক্রো-বেঞ্চমার্কিংয়ে যে পার্থক্যটি পাওয়া গেছে সেটি ছিল 0.18 মাইক্রোসেকেন্ডস ...
ভিক্টর শ্রড্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.