পাইথনে পরিবেশ পরিবর্তনশীল কীভাবে সেট করবেন


658

পাইথন স্ক্রিপ্টে আমাকে কিছু পরিবেশের পরিবর্তনশীল সেট করতে হবে এবং আমি পাইথন থেকে আহ্বান করা অন্যান্য সমস্ত স্ক্রিপ্টগুলি পরিবেশের ভেরিয়েবলগুলি সেট দেখতে চাই।

যদি আমি করি

os.environ["DEBUSSY"] = 1`

এটি অভিযোগ করে যে 1স্ট্রিং হতে হবে।

আমি এটি একবার সেট করার পরে পাইথন (স্ক্রিপ্টের পরবর্তী অংশে) পরিবেশের পরিবর্তনশীলগুলি কীভাবে পড়তে হয় তা জানতে চাই want



এছাড়াও সম্পর্কিত: youtu.be/ScyxIfOuSXs?t=61
ইয়ানিক হামান

প্রশ্নের সাথে সম্পর্কিত নয়: আমি সেই ভারটি পড়েছি। ক্যাট
আহমদ

উত্তর:


790

পরিবেশের ভেরিয়েবলগুলি অবশ্যই স্ট্রিং হওয়া উচিত, সুতরাং ব্যবহার করুন

os.environ["DEBUSSY"] = "1"

DEBUSSYস্ট্রিংয়ে ভেরিয়েবল সেট করতে 1

এই ভেরিয়েবলটি পরে অ্যাক্সেস করতে সহজভাবে ব্যবহার করুন:

print(os.environ["DEBUSSY"])

শিশু প্রক্রিয়াগুলি স্বয়ংক্রিয়ভাবে পিতামাতার প্রক্রিয়ার পরিবেশগত ভেরিয়েবলের উত্তরাধিকারী হয় - আপনার পক্ষ থেকে কোনও বিশেষ ক্রিয়াকলাপের প্রয়োজন নেই।


20
কিছু প্ল্যাটফর্মে, os.en वातावरण পরিবর্তন করা প্রকৃতপক্ষে বর্তমান প্রক্রিয়া বা শিশু প্রক্রিয়াগুলির জন্য সিস্টেম পরিবেশকে সংশোধন করবে না। আরও তথ্যের জন্য ডকগুলি
ইভান

8
@ ইভান ইউনিক্সের কিছু historicalতিহাসিক রূপ থাকতে পারে যা সমর্থন করে না putenv(), তবে সেই ইউনিক্সেনের জন্য আপনি যাইহোক কিছুই করতে পারবেন না। এমনকি আমি এআইএক্স এবং এইচপিউএক্স এর পুরানো সংস্করণ এর সাথে সমর্থন করেছি। যদি কেউ আজ সত্যিই কোনও কম্পিউটার এটি সমর্থন করে না তা খুঁজে পেতে সক্ষম হয় তবে আমার প্রচণ্ড সন্দেহ রয়েছে যে তারা সেই কম্পিউটারে পাইথন চালাতে সক্ষম হবেন। :)
সোভেন মারনাচ

3
সাবধানতা: উপরের @ ইভানের রেফারেন্স থেকে উদ্ধৃত করা, পরিবেশে এই জাতীয় পরিবর্তনগুলি ওএস.সিস্টেম (), পপেন () বা কাঁটাচামচ () এবং এক্সিকিভ () দিয়ে শুরু হয়ে উপ-প্রক্রিয়াগুলিকে প্রভাবিত করে। অন্য কথায়, মনে রাখবেন যে এই প্রোগ্রামটি আপনার প্রোগ্রামটি যেভাবে চলছে, কেবল আপনার প্রোগ্রামের বাচ্চাগুলি যেভাবে চালাচ্ছে তা সংশোধন করবে না। সত্য, আপনার প্রোগ্রামটি পরিবেশের ভেরিয়েবলগুলি সেট এবং ফিরে পঠন করতে পারে, তবে কেবল পরিবেশ থেকে এটি তার বাচ্চাদের জন্য কনফিগার করে। আরও দেখুন: বর্তমান প্রক্রিয়া পরিবেশ পরিবর্তন করুন । এখনও অবধি পাইথন স্ক্রিপ্টের এর পিতামাতার এনভিকেট সংশোধন করার কোনও উপায় আমি খুঁজে পাইনি।
কোড

1
@ স্পেনমার্নাচের বক্তব্যটি হ'ল "শিশু প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পিতামাতার প্রক্রিয়াটির পরিবেশকে উত্তরাধিকার সূত্রে উত্তম করে তোলে ash বাশের মতো শেলের জন্য সত্য
কৃষ্ণা ওজা

@darth_coder এটি ইউনিক্সের মতো অপারেটিং সিস্টেমের সমস্ত প্রক্রিয়ার ক্ষেত্রে সত্য। আমি অন্যান্য অপারেটিং সিস্টেম সম্পর্কে জানি না। নোট করুন যে শেল ভেরিয়েবলগুলি আপনি রফতানি না করে পরিবেশে সংরক্ষণ করা হবে না।
সোভেন মারনাচ

114

কোড দৃust়তার জন্য আপনাকে আরও কিছু দিক বিবেচনা করতে হবে;

আপনি যখন একটি পরিবেশের ভেরিয়েবল হিসাবে একটি পূর্ণসংখ্যা-মূল্যবান ভেরিয়েবল সংরক্ষণ করছেন, চেষ্টা করুন

os.environ['DEBUSSY'] = str(myintvariable)

তারপরে পুনরুদ্ধারের জন্য, ত্রুটিগুলি এড়ানোর জন্য বিবেচনা করুন, আপনার চেষ্টা করা উচিত

os.environ.get('DEBUSSY', 'Not Set')

সম্ভবত 'সেট করা নেই' এর জন্য '-1' বিকল্পযুক্ত

সুতরাং, সব একসাথে রাখা

myintvariable = 1
os.environ['DEBUSSY'] = str(myintvariable)
strauss = int(os.environ.get('STRAUSS', '-1'))
# NB KeyError <=> strauss = os.environ['STRAUSS']
debussy = int(os.environ.get('DEBUSSY', '-1'))

print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)

3
আপনি কী বলতে পারবেন কীভাবে লিনাক্স মেশিনে ভেরিয়েবল সেট করা যায়, সমস্ত প্ল্যাটফর্মের জন্য কোডটি কি সমান?
অনুরাগ-শর্মা

2
অনুপস্থিত পূর্ণসংখ্যার জন্য এটি -1 স্টোর করা খুব কমই বুদ্ধিমান। আরও ভাল বাজি myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else Noneহ'ল
কোনওোটাই

1
আপনি যদি পূর্ণসংখ্যার সাথে কাজ করে থাকেন তবে একটি -1 অর্থবোধ করে। যদিও আমি সেট না করে (যেমন,value_not_set = '-1' ) । তারপরে, আপনি ব্যবহার করতে পারেনdebussy = int(os.environ.get('DEBUSSY', value_not_set))
YeOldeDataSmythe

68

os.environঅজগর অভিধানের মতো আচরণ করে, তাই সাধারণ ডিকশনারি ক্রিয়াকলাপ সম্পাদন করা যায়। ছাড়াও getএবং setঅন্যান্য উত্তর উল্লেখিত অপারেশন, আমরা কেবল পরীক্ষা করতে পারবেন যদি একটি কী বিদ্যমান। কী এবং মানগুলি স্ট্রিং হিসাবে সংরক্ষণ করা উচিত ।

পাইথন ঘ

পাইথন 3 জন্য, অভিধান ব্যবহার মধ্যে পরিবর্তে শব্দ has_key

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

পাইথন 2

>>> import os
>>> os.environ.has_key('HOME')  # Check an existing env. variable
True
>>> os.environ.has_key('FOO')   # Check for a non existing variable
False
>>> os.environ['FOO'] = '1'     # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO')       # Retrieve the value
'1'

ব্যবহার সম্পর্কে একটি গুরুত্বপূর্ণ বিষয় লক্ষ্যণীয় os.environ:

যদিও শিশু প্রক্রিয়াগুলি পিতামাতার প্রক্রিয়া থেকে পরিবেশের উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে আমি সম্প্রতি একটি সমস্যা নিয়ে এসেছি এবং বুঝতে পেরেছিলাম, আপনার পাইথন স্ক্রিপ্ট চলাকালীন আপনার যদি পরিবেশের আপডেট করার অন্যান্য স্ক্রিপ্ট থাকে তবে os.environআবার কল করা সর্বশেষ মানগুলি প্রতিফলিত করবে না

দস্তাবেজগুলি থেকে কিছু অংশ :

এই ম্যাপিংটি প্রথমবার ওএস মডিউলটি আমদানি করার সময় ক্যাপচার করা হয়, সাধারণত সাইট পাইপ প্রসেসিংয়ের অংশ হিসাবে পাইথন স্টার্টআপের সময় imported এই সময়ের পরে পরিবেশে পরিবর্তনগুলি os.en পরিবেশে প্রতিফলিত হয় না, সরাসরি os.en वातावरण পরিবর্তন করে করা পরিবর্তনগুলি ব্যতীত।

os.environ.data যা সমস্ত পরিবেশের ভেরিয়েবল সংরক্ষণ করে, এটি একটি ডিক অবজেক্ট, যাতে পরিবেশের সমস্ত মান থাকে:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>

1
প্রক্রিয়াটি তৈরি হওয়ার পরে একটি প্রক্রিয়ার পরিবেশ পরিবর্তনশীল সেট করা হয়। এর পরে যে কোনও পরিবর্তনগুলি প্রক্রিয়াটির নিজস্ব পরিবেশে চলকটির নিজস্ব অনুলিপিটিকে প্রভাবিত করবে না। এটি কেবলমাত্র পাইথন নয়, সমস্ত প্রক্রিয়াতে সাধারণ। এরপরে, os.environ.dataপাইথনকে ৩.২ থেকে নতুন নামকরণ করা হয়েছিল os.environ._data, আন্ডারস্কোর উপসর্গটি আপনাকে দেখায় যে এটি সরাসরি পড়তে হবে না। যাইহোক, যাইহোক, os.environ._dataআপডেট মান হবে না।
আল সুইগার্ট

হ্যাঁ, আমি এখন বুঝতে পারি। আমি আমার প্রাথমিক বিস্ময়টি অন্যদের সাথে ভাগ করে নিতে চেয়েছিলাম যারা খুঁজছেন। 3.2 সাল থেকে পরিবর্তনশীল নামের আপডেটটি নির্দেশ করার জন্য ধন্যবাদ, উত্তরটি আপডেট করবে।
সিসানারাড

21

যদি আমি os.en পরিবেশ ["DEBUSSY"] = 1 করি, এটি অভিযোগ করে যে 1 টি স্ট্রিং হতে হবে।

তাহলে কর

os.environ["DEBUSSY"] = "1"

আমি এটি অজানাতে (স্ক্রিপ্টের পরবর্তী অংশে) অজুতে পরিবেশের পরিবর্তনশীলগুলি কীভাবে পড়তে হয় তা জানতে চাই।

শুধু os.environ["DEBUSSY"]হিসাবে ব্যবহার করুন

some_value = os.environ["DEBUSSY"]

19

পরিবর্তনশীল সেট করতে:

কী ব্যবহার করে আইটেম অ্যাসাইনমেন্ট পদ্ধতি:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

পেতে বা এটি বিদ্যমান ছিল কি না তা যাচাই করতে,

যেহেতু os.en वातावरण একটি উদাহরণ তাই আপনি অবজেক্ট উপায় চেষ্টা করতে পারেন।

পদ্ধতি 1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

'1'রিটার্ন মান হিসাবে পাবেন

পদ্ধতি 2:

os.environ['DEBUSSY'] # will throw an key error if not found!

পদ্ধতি 3:

'DEBUSSY' in os.environ  # will return Boolean True/False

পদ্ধতি 4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements

16

আপনার পরিবেশের পরিবর্তনশীলকে স্ট্রিংয়ের মান নির্ধারণ করা উচিত।

os.environ["DEBUSSY"] = "1"

আপনি যদি পরিবেশের পরিবর্তনশীলটি পড়তে বা মুদ্রণ করতে চান তবে কেবল ব্যবহার করুন

print os.environ["DEBUSSY"]

এই পরিবর্তনগুলি কেবলমাত্র বর্তমান প্রক্রিয়ার জন্য কার্যকর হবে যেখানে এটি নির্ধারিত হয়েছিল, স্থায়ীভাবে এটি কোনও মান পরিবর্তন করবে না। শিশু প্রক্রিয়াগুলি স্বয়ংক্রিয়ভাবে পিতামাতার প্রক্রিয়ার পরিবেশের উত্তরাধিকারী হবে।

এখানে চিত্র বর্ণনা লিখুন


5
"এই পরিবর্তনগুলি কেবলমাত্র বর্তমান প্রক্রিয়ার জন্য কার্যকর হবে যেখানে এটি নির্ধারিত হয়েছিল, এটি স্থায়ীভাবে মান পরিবর্তন করবে না।" এটি পরিবেশের ভেরিয়েবল সেট করার সুযোগ সম্পর্কে আমার একটি প্রশ্নের উত্তর দিয়েছিল।
স্পিটিফায়ার্ড '

2
যদি আমি পাইথন শেলটি থেকে প্রস্থান করি এবং ওস এনভায়রনমেট সেটটি আগে চলে গেছে।
MeadowMuffins

আমি কীভাবে উইন্ডোতে পরিবেশের পরিবর্তনশীল সেট করব? আমি চেষ্টা করেছি set [<name>=[<value>]]তবে এটি কেবল চলমান চলমান প্রক্রিয়ার জন্যই তৈরি করে। আমি যখন সেন্টিমিডিটি বন্ধ করি তখন এটি বিদ্যমান না এবং এটি যখন অন্য প্রোগ্রামগুলি খোলা হয় তখনও এটি দেখতে পায় না।
ফিলিপ করুন

15

কি হবে os.environ["DEBUSSY"] = '1'? পরিবেশের ভেরিয়েবল সর্বদা স্ট্রিং থাকে।


14

আমি পরিবেশের ভেরিয়েবল যুক্ত করার চেষ্টা করছি। আমার লক্ষ্যটি ছিল কিছু ব্যবহারকারীর তথ্য সিস্টেমের ভেরিয়েবলগুলিতে সঞ্চয় করা যা আমি ভবিষ্যতের সমাধানগুলির জন্য সেই পরিবর্তনশীলগুলি ফাইল কনফিগার করার বিকল্প হিসাবে ব্যবহার করতে পারি। তবে নীচের কোডে বর্ণিত পদ্ধতিটি আমাকে মোটেই সহায়তা করে না।

import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")

এই সাধারণ কোড ব্লকটি ভালভাবে কাজ করে, তবে, এই ভেরিয়েবলগুলি সংশ্লিষ্ট প্রসেসগুলির মধ্যে বিদ্যমান যেমন আপনি উইন্ডোজ সিস্টেম সেটিংসের পরিবেশের ভেরিয়েবল ট্যাবে এটি পাবেন না। খুব উপরে কোডটি আমার উদ্দেশ্যটি পরিবেশন করে নি। এই সমস্যাটি এখানে আলোচনা করা হয়েছে: পরিবর্তনশীল সংরক্ষণের সমস্যা

os.environ.putenv(key, value)

আরেকটি ব্যর্থ প্রচেষ্টা। সুতরাং, অবশেষে, আমি ওএস প্যাকেজের সিস্টেম ক্লাসের ভিতরে মোড়ানো উইন্ডোজ শেল কমান্ডের নকল করে উইন্ডো পরিবেশের নিবন্ধের মধ্যে সফলভাবে পরিবর্তনশীল সংরক্ষণ করতে সক্ষম হয়েছি। নিম্নলিখিত কোডটি এই সফল প্রচেষ্টাটির বর্ণনা দেয়।

os.system("SETX {0} {1} /M".format(key, value))

আমি আশা করি এটি আপনার কারও জন্য সহায়ক হবে।


12

এটি লক্ষণীয় হওয়া উচিত যে আপনি যদি পরিবেশের পরিবর্তনশীলটিকে বাশ মূল্যায়নে সেট করার চেষ্টা করেন তবে এটি আপনার প্রত্যাশাকে সংরক্ষণ করবে না । উদাহরণ:

from os import environ

environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"

এটি শেলের মতো এটির মূল্যায়ন করবে না, সুতরাং /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeপথ হিসাবে পরিবর্তিত হওয়ার পরিবর্তে আপনি আক্ষরিক ভাবটি পাবেন$(/usr/libexec/java_home)

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

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/java_home)"
capture = Popen(f"echo {bash_variable}", stdout=PIPE, shell=True)
std_out, std_err = capture.communicate()
return_code = capture.returncode

if return_code == 0:
    evaluated_env = std_out.decode().strip()
    environ["JAVA_HOME"] = evaluated_env
else:
    print(f"Error: Unable to find environment variable {bash_variable}")

11

আপনি ব্যবহার করতে পারেন os.environআপনার পরিবেশের ভেরিয়েবলগুলি অ্যাক্সেস ।

এখন, আমার একটি সমস্যা হ'ল যদি আমি এমন os.systemএকটি ব্যাচ ফাইল চালানোর চেষ্টা করি যা আপনার পরিবেশের ভেরিয়েবলগুলি সেট করে (** ব্যাট * ফাইলের মধ্যে এসইটি কমান্ড ব্যবহার করে) এটি আপনার অজগর পরিবেশের জন্য সত্যই সেট করে না (তবে জন্য os.systemফাংশন দিয়ে তৈরি করা শিশু প্রক্রিয়া )। পাইথন পরিবেশে ভেরিয়েবলগুলি সেট করতে আমি এই স্ক্রিপ্টটি ব্যবহার করি:

import re
import system
import os

def setEnvBat(batFilePath, verbose = False):
    SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
    SetEnvFile = open(batFilePath, "r")
    SetEnvText = SetEnvFile.read()
    SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)

    for SetEnvMatch in SetEnvMatchList:
        VarName=SetEnvMatch[0]
        VarValue=SetEnvMatch[1]
        if verbose:
            print "%s=%s"%(VarName,VarValue)
        os.environ[VarName]=VarValue

9

আপনি যখন পরিবেশের ভেরিয়েবলগুলির সাথে খেলেন (ভেরিয়েবলগুলি যুক্ত / সংশোধন / সরিয়ে ফেলুন), ফাংশন সমাপ্তিতে পূর্বের অবস্থাটি পুনরুদ্ধার করা একটি ভাল অনুশীলন।

মত আপনি কিছু প্রয়োজন হতে পারে modified_environপ্রসঙ্গ ম্যানেজার এই বর্ণনা প্রশ্ন এনভায়রনমেন্ট ভেরিয়েবল পুনঃস্থাপন।

ক্লাসিক ব্যবহার:

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