همه چیز درباره متغیرهای محیطی در پایتون
متغیرهای محیطی مقادیر از پیش تعیین شده ای هستند که معمولاً برای پیکربندی یک مقدار خارج از برنامه شما استفاده می شوند. با استفاده از متغیرهای محیطی میتوانید، تنظیمات مختلفی را برای محیطهای مختلف توسعه پیکربندی کنید.
متغیرهای محیطی روشی عالی برای پیکربندی برنامه پایتون شما ارائه میکنند و نیاز به ویرایش سورس کد شما را در صورت تغییر پیکربندی حذف میکنند. موارد پیکربندی رایجی که اغلب از طریق متغیرهای محیطی به برنامه ارسال میشوند عبارتند از کلیدهای API شخص ثالث، پورتهای شبکه، سرورهای پایگاه داده و هر گزینه سفارشی که ممکن است برنامه شما برای درست کار کردن به آن نیاز داشته باشد.
در این مقاله قصد دارم برخی از تکنیک ها و ابزارهای موجود در پایتون برای کار با متغیرهای محیطی را به اشتراک بگذارم.
ویدیو پیشنهادی: آموزش متغیرهای محیطی در لینوکس
# چطور در پایتون به متغیرهای محیطی دسترسی پیدا کنیم؟
+ استفاده از دیکشنری os.environ
در پایتون، دیکشنری os.environ
تمام متغیرهای محیطی را در خود دارد. ساده ترین روش برای خواندن اطلاعات، استفاده از سینتکس استاندارد کار با دیکشنری است. مثلا به روش زیر میتوانید به متغیر محیطی USER
دسترسی پیدا کنید:
>>> import os
>>> user = os.environ['USER']
>>> user
'amir'
با استفاده از این روش، اگر متغیر محیطی را درخواست کنید که وجود ندارد، پایتون ارور KeyError
را نشان میدهد:
>>> database_url = os.environ['DATABASE_URL']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/miguel/.pyenv/versions/3.8.6/lib/python3.8/os.py", line 675, in __getitem__
raise KeyError(key) from None
KeyError: 'DATABASE_URL'
+ استفاده از os.environ.get
دریافت KeyError ایده خوبی برای متغیرهای محیطی است که برنامه شما به آن نیاز دارد، اما شرایطی وجود دارد که ممکن است بخواهید به برخی از متغیرها اجازه دهید تا اختیاری باشند.
برای جلوگیری از خطا میتوانید از متد get() دیکشنری استفاده کنید که وقتی کلید درخواستی در دیکشنری وجود نداشته باشد، None را برمیگرداند:
>>> database_url = os.environ.get('DATABASE_URL')
None
+ اضافه کردن مقدار پیشفرض در صورت عدم وجود متغیر محیطی
اگر میخواهید یک مقدار پیشفرض برای متغیر گمشده ارائه کنید که None نیست، میتوانید آن را به عنوان آرگومان دوم اضافه کنید:
>>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///')
>>> database_url
'sqlite:///'
+ استفاده از os.getenv
پایتون همچنین تابع os.getenv() را برای دسترسی به متغیرهای محیطی فراهم می کند. این تابع به روشی بسیار شبیه به متد os.environ.get () کار می کند. در اینجا نحوه دسترسی به یک متغیر با آن آورده شده است:
>>> user = os.getenv('USER')
>>> user
'amir'
این تابع برای متغیرهایی که وجود ندارند خطایی ایجاد نمی کند و مانند os.environ.get() مقدار None را برمی گرداند. و همچنین آرگومان دوم برای مقدار پیش فرض را می پذیرد:
>>> database_url = os.getenv('DATABASE_URL', 'sqlite://')
>>> database_url
'sqlite://'
آیا os.getenv() بهتر از os.environ است؟ این واقعاً به شما بستگی دارد. من شخصا ترجیح می دهم از دیکشنری os.environ استفاده کنم، زیرا این گزینه را به من می دهد که در صورت عدم وجود متغیر مورد نیاز، برنامه را با یک خطای KeyError
متوقف کنم.
# چطور در پایتون متغیرهای محیطی جدیدی ایجاد کنیم؟
در این بخش میخواهم خلاصهای سریع از نحوه تنظیم متغیرهای محیطی در یک ترمینال یا خط فرمان ویندوز به شما ارائه کنم.
+ در unix و macos
دو روش اساسی برای تنظیم یک متغیر محیطی از ترمینال bash یا zsh وجود دارد. یکی استفاده از کلمه کلیدی export است:
export DEBUG=true
متغیری که به این صورت تنظیم می شود به هر برنامه یا اسکریپتی که از این ترمینال شروع می کنید منتقل می شود. به خاطر داشته باشید که متغیرهای محیطی در جایی خارج از ترمینال ذخیره نمی شوند، بنابراین با بستن ترمینال از بین می روند.
یک راه جایگزین برای تعریف یک متغیر محیطی این است که آن را در همان خطی که برنامه هدف اجرا می شود، تنظیم کنید:
DEBUG=true python my_cool_application.py
این فرم دوم این مزیت را دارد که متغیر فقط در فضای محیط برنامه مورد نظر تنظیم می شود.
+ در windows
اگر از ویندوز استفاده می کنید چند گزینه دارید. اگر در کامندلاین هستید، می توانید یک متغیر محیطی را با استفاده از دستور set تنظیم کنید:
set DEBUG=true
مانند یونیکس، این متغیر فراتر از کامندلاین جاری ذخیره نمی شود. اگر از کنسول جدیدتر PowerShell استفاده می کنید، نحو برای تنظیم متغیرهای محیطی کاملاً متفاوت است:
$Env:DEBUG = "true"
# استفاده از فایل env.
آیا با همه این روش های مختلف برای تنظیم متغیرهای محیطی گیج شده اید؟ من شخصاً این را ناخوشایند می دانم که هر پلت فرم به روش متفاوتی نیاز دارد.
به نظر من، یک راه بهتر برای مدیریت متغیرهای محیطی ذخیره آنها در یک فایل env. است. یک فایل env یک فایل متنی است که در آن متغیرها در هر خط یکی تعریف شده اند. فرمت یک فایل env در همه سیستم عامل ها دقیقاً یکسان است، بنابراین فایل های env کار با متغیرهای محیطی را در همه سیستم عامل ها یکسان می کند. و نوشتن متغیرهای محیطی شما در فایلی که به طور خودکار توسط پایتون import میشود به این معنی است که لازم نیست هر بار که یک shell جدید را شروع میکنید، آنها را به صورت دستی تنظیم کنید.
در اینجا یک مثال کوتاه از فایل env با دو متغیر است:
DEBUG=true
DATABASE_URL=sqlite:///mydb.sqlite
شما می توانید یک فایل env در دایرکتوری ریشه هر یک از پروژه های خود ایجاد کنید، و به این ترتیب می توانید تمام متغیرهای مورد نیاز هر پروژه را به طور مرتب سازماندهی کنید!
پکیج python-dotenv به یک برنامه پایتون اجازه می دهد تا متغیرهای تعریف شده در یک فایل env را به محیط وارد کند. با استفاده از pip می توانید python-dotenv را در محیط مجازی خود نصب کنید:
pip install python-dotenv
در زیر می توانید نحوه وارد کردن یک فایل env را در برنامه پایتون مشاهده کنید:
>>> from dotenv import load_dotenv
>>> load_dotenv()
تابع load_dotenv به دنبال فایلی به نام env در دایرکتوری فعلی می گردد و تمام تعاریف متغیر موجود در آن را به دیکشنری os.environ اضافه می کند. اگر یک فایل env در دایرکتوری فعلی یافت نشد، دایرکتوری والد برای آن جستجو می شود. جستجو در سلسله مراتب دایرکتوری بالا می رود تا زمانی که یک فایل .env پیدا شود یا به بالاترین سطح دایرکتوری برسد.
اگر میخواهید python-dotenv را از جستجوی فایل env از طریق دایرکتوریهای خود منع کنید، میتوانید یک مسیر واضح به فایل خود به عنوان آرگومان برای load_dotenv ارسال کنید:
>>> from dotenv import load_dotenv
>>> load_dotenv('/home/miguel/my_project/.env')
هنگامی که فایل env ایمپورت شد، می توانید با استفاده از هر یک از روش های نشان داده شده در بالا به متغیرهای محیطی دسترسی داشته باشید.
+ یک نکته امنیتی درباره فایل env
در بسیاری از موارد، متغیرهای محیطی را که حاوی اطلاعات حساسی هستند مانند رمز عبور یا کلیدهای API، را به فایلهای env. اضافه میکنید. به همین دلیل، به طور کلی نمی خواهید این فایل ها را به git پروژه خود اضافه کنید. روش استاندارد این است که نام این فایل را به gitignore اضافه کنید تا وارد مخزن git نشود.
# نتیجه گیری
امیدوارم این مقاله برای کمک به درک نحوه استفاده از متغیرهای محیطی برای پیکربندی پروژه های پایتون مفید بوده باشد.