Biến môi trường cung cấp một cách tuyệt vời để định cấu hình ứng dụng Python của bạn, loại bỏ nhu cầu chỉnh sửa mã nguồn của bạn khi cấu hình thay đổi. Các mục cấu hình phổ biến thường được chuyển đến ứng dụng thông qua các biến môi trường là khóa API của bên thứ ba, cổng mạng, máy chủ cơ sở dữ liệu và bất kỳ tùy chọn tùy chỉnh nào mà ứng dụng của bạn có thể cần để hoạt động bình thường
Trong bài viết này, tôi sẽ chia sẻ một số kỹ thuật và công cụ có sẵn trong Python để làm việc với các biến môi trường
Cách truy cập các biến môi trường từ Python
Sử dụng hệ điều hành. từ điển môi trường
Trong Python, từ điển >>> 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' 4 chứa tất cả các biến môi trường. Cách đơn giản nhất để truy xuất một biến từ bên trong ứng dụng của bạn là sử dụng cú pháp từ điển chuẩn. Ví dụ: đây là cách bạn có thể truy cập một biến môi trường có tên >>> 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' 5
>>> import os >>> user = os.environ['USER'] >>> user 'miguel'
Sử dụng phương pháp này, nếu bạn cố gắng nhập một biến môi trường không tồn tại, Python sẽ đưa ra một ngoại lệ >>> 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' 6
>>> 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'
Sử dụng hệ điều hành. môi trường. được()
Lấy >>> 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' 6 là một ý tưởng hay cho các biến môi trường mà chương trình của bạn yêu cầu, nhưng có những trường hợp bạn có thể muốn cho phép một số biến là tùy chọn. Để tránh lỗi, bạn có thể sử dụng phương thức >>> 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' 8 của từ điển, phương thức này trả về >>> 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' 9 khi khóa được yêu cầu không tồn tại trong từ điển
________số 8_______
Thêm một giá trị mặc định nếu biến không được xác định
Nếu bạn muốn cung cấp giá trị mặc định cho biến bị thiếu không phải là >>> 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' 9, bạn có thể thêm biến đó làm đối số thứ hai
>>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///'
Sử dụng hệ điều hành. hàm getenv()
Python cũng cung cấp hàm >>> database_url = os.environ.get('DATABASE_URL') 1 để truy cập các biến môi trường. Hàm này hoạt động theo cách rất giống với phương thức >>> database_url = os.environ.get('DATABASE_URL') 2. Đây là cách truy cập một biến với nó
>>> user = os.getenv('USER') >>> user 'miguel'
Hàm này không gây ra lỗi cho các biến bị thiếu, nó trả về >>> 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' 9 giống như >>> database_url = os.environ.get('DATABASE_URL') 2. Và nó cũng chấp nhận đối số thứ hai với giá trị mặc định tùy chỉnh
>>> database_url = os.getenv('DATABASE_URL', 'sqlite://') >>> database_url 'sqlite://'
>>> database_url = os.environ.get('DATABASE_URL') 1 có tốt hơn >>> 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' 4 không? . Cá nhân tôi thích sử dụng từ điển >>> 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' 4 hơn, vì nó cho tôi tùy chọn tạm dừng chương trình bằng >>> 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' 6 nếu thiếu một biến bắt buộc
Cách đặt biến môi trường
Trong phần này, tôi sẽ cung cấp cho bạn một bản tóm tắt nhanh về cách đặt biến môi trường trong cửa sổ dấu nhắc lệnh hoặc thiết bị đầu cuối. Nếu bạn muốn biết tất cả các cách có thể để đặt biến môi trường, đồng nghiệp của tôi, Dominik Kundel đã viết một bài đăng trên blog rất chi tiết về chủ đề này với tiêu đề Cách đặt biến môi trường
Unix và MacOS
Có hai cách cơ bản để đặt biến môi trường từ phiên cuối bash hoặc zsh. Một là sử dụng từ khóa >>> database_url = os.environ.get('DATABASE_URL') 9
export DEBUG=true
Một biến được đặt theo cách này sẽ được chuyển sang bất kỳ chương trình hoặc tập lệnh nào mà bạn bắt đầu từ phiên cuối này. Hãy nhớ rằng các biến môi trường không được lưu ở bất kỳ đâu bên ngoài ngữ cảnh của phiên shell, vì vậy chúng sẽ biến mất khi bạn đóng phiên cuối
Một cách khác để xác định biến môi trường là đặt nó trong cùng một dòng nơi ứng dụng đích được thực thi
DEBUG=true python my_cool_application.py
Dạng thứ hai này có lợi ích là biến chỉ được đặt trong không gian môi trường của ứng dụng dự định
Microsoft Windows
Nếu bạn đang sử dụng Windows, bạn có một số tùy chọn. Nếu bạn quan tâm đến việc đặt các biến môi trường thông qua bảng điều khiển, hãy xem bài viết được liên kết ở trên
Nếu bạn đang ở trong cửa sổ nhắc lệnh, bạn có thể đặt biến môi trường bằng lệnh >>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///' 0
set DEBUG=true
Giống như trong trường hợp Unix, biến không được lưu trữ hoặc ghi nhớ ngoài phiên hiện tại
Nếu bạn đang sử dụng bảng điều khiển PowerShell mới hơn, thì cú pháp đặt biến môi trường sẽ hoàn toàn khác
$Env:DEBUG = "true"
Cuối cùng, nếu bạn đang sử dụng lớp tương thích Unix như WSL hoặc Cygwin, thì bạn phải đi tới phần Unix ở trên và sử dụng bất kỳ phương pháp nào được liệt kê ở đó cho bash hoặc zsh
sử dụng. tập tin env
Bạn có bối rối trước tất cả các cách khác nhau để đặt biến môi trường không?
Theo tôi, cách tốt hơn để quản lý các biến môi trường của bạn là lưu trữ chúng trong một. tệp env (phát âm là dấu chấm env). Một. tệp env là tệp văn bản trong đó các biến được xác định, mỗi biến một dòng. Định dạng của một. env hoàn toàn giống nhau trong tất cả các hệ điều hành, vì vậy. tệp env giúp hoạt động với các biến môi trường thống nhất trên tất cả các nền tảng. Và như thể điều này là chưa đủ, việc các biến môi trường của bạn được ghi trong một tệp được Python nhập tự động có nghĩa là bạn không phải đặt chúng theo cách thủ công mỗi khi khởi động một trình bao mới
Đây là một đoạn ngắn. ví dụ tệp env với hai biến
>>> 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' 0
Bạn có thể tạo một. env trong thư mục gốc của từng dự án của bạn và bằng cách đó bạn có thể giữ tất cả các biến cần thiết cho từng dự án được sắp xếp gọn gàng
Gói python-dotenv cho phép ứng dụng Python nhập các biến được xác định trong. env vào môi trường. Bạn có thể cài đặt >>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///' 1 trong môi trường ảo của mình bằng cách sử dụng >>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///' 2
>>> 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' 1
Dưới đây bạn có thể xem cách nhập một. env vào ứng dụng Python
>>> 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' 2
Hàm >>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///' 3 sẽ tìm một tệp có tên. env trong thư mục hiện tại và sẽ thêm tất cả các định nghĩa biến trong đó vào từ điển >>> 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' 4. Nếu một. tệp env không được tìm thấy trong thư mục hiện tại, sau đó thư mục mẹ được tìm kiếm cho nó. Việc tìm kiếm tiếp tục đi lên trong hệ thống phân cấp thư mục cho đến khi một. tệp env được tìm thấy hoặc đạt đến thư mục cấp cao nhất
Nếu bạn muốn ngăn python-dotenv tìm kiếm một. env qua các thư mục của bạn, bạn có thể chuyển một đường dẫn rõ ràng tới tệp của mình làm đối số cho >>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///' 3
>>> 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' 3
Có một số đối số bổ sung mà bạn có thể sử dụng khi gọi hàm >>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///') >>> database_url 'sqlite:///' 3. Nếu bạn muốn tìm hiểu về chúng, hãy tham khảo tài liệu
Một khi. env được nhập, bạn có thể truy cập các biến môi trường bằng bất kỳ phương pháp nào được hiển thị ở trên
Một lưu ý về. bảo mật tập tin env
Trong nhiều trường hợp, bạn sẽ thêm các biến môi trường chứa thông tin nhạy cảm vào. env, như mật khẩu hoặc khóa API. Vì lý do đó, nói chung, bạn không muốn thêm các tệp này vào kho kiểm soát nguồn dự án của mình
Thực tiễn tiêu chuẩn là thêm một ngoại lệ cho các tệp có tên này để chúng không bị cam kết kiểm soát nguồn do nhầm lẫn. Đối với git, bạn có thể thêm một dòng có tên tệp vào. gitignore trong thư mục gốc của kho lưu trữ của bạn
Nhưng nếu bạn không thể cam kết. env, làm cách nào để thông báo cho người dùng của dự án những biến nào cần được đặt? . env vào kho lưu trữ của bạn với tên chẳng hạn như. env. ví dụ, chứa danh sách các biến mà dự án yêu cầu, nhưng không bao gồm các giá trị của chúng. Điều này đóng vai trò là hướng dẫn cho người dùng dự án của bạn mà không cung cấp thông tin nhạy cảm
Phần kết luận
Tôi hy vọng bài viết này hữu ích để giúp bạn hiểu cách sử dụng các biến môi trường để định cấu hình các dự án Python của bạn
Bạn có cách nào khác để làm việc với các biến môi trường không?
Miguel Grinberg là Nhà phát triển Python cho Nội dung Kỹ thuật tại Twilio. Hãy liên hệ với anh ấy tại mgrinberg [at] twilio [dot] com nếu bạn có một dự án Python thú vị mà bạn muốn chia sẻ trên blog này