Python env là gì?

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

Làm cách nào để sử dụng env trong Python?

Để đặt và nhận các biến môi trường trong Python, bạn chỉ cần sử dụng mô-đun os . nhập os # Đặt biến môi trường os. môi trường ['API_USER'] = 'tên người dùng' hệ điều hành. environ['API_PASSWORD'] = 'bí mật' # Lấy các biến môi trường USER = os.

Thư mục env trong Python là gì?

Tạo môi trường . Thư mục này chứa các thư mục để cài đặt mô-đun và tệp thực thi Python . Bạn cũng có thể chỉ định phiên bản Python mà bạn muốn làm việc với.

Sự khác biệt giữa venv và env là gì?

Sự khác biệt duy nhất là virtualenv là mô-đun bên thứ 3 cần được cài đặt và venv là một phần của thư viện chuẩn python . Xóa môi trường ảo cũng đơn giản như xóa thư mục dành riêng cho môi trường ảo. Hãy nhớ rằng một môi trường ảo không gì khác hơn là một thư mục.