Chủ đề env pythonpath: ENV PYTHONPATH là một trong những khái niệm quan trọng giúp lập trình viên Python quản lý các thư viện và module hiệu quả hơn. Bài viết này sẽ hướng dẫn bạn cách thiết lập, sử dụng, và tối ưu hóa PYTHONPATH trong các dự án Python, từ cơ bản đến nâng cao, để đảm bảo mã nguồn hoạt động chính xác và dễ dàng mở rộng.
Trong quá trình phát triển phần mềm bằng Python, việc quản lý các biến môi trường là một yếu tố quan trọng. PYTHONPATH là một biến môi trường được sử dụng để chỉ định các thư mục bổ sung mà Python sẽ tìm kiếm khi nhập các module. Bên cạnh đó, tệp .env giúp lưu trữ các biến môi trường cụ thể cho từng dự án.
PYTHONPATH cung cấp cho Python danh sách các đường dẫn bổ sung để tìm kiếm các module khi sử dụng câu lệnh import. Điều này rất hữu ích khi làm việc với các dự án có cấu trúc phức tạp hoặc cần thêm các thư viện bên ngoài không được cài đặt trong hệ thống Python mặc định.
Để cấu hình PYTHONPATH, có thể sử dụng một trong các cách sau:
Tệp .env giúp quản lý các biến môi trường trong dự án một cách hiệu quả. Nó giúp bảo mật các thông tin nhạy cảm như API keys, mật khẩu và cấu hình riêng tư khác.
Dưới đây là một ví dụ về cách sử dụng PYTHONPATH trong tệp .env:
PYTHONPATH=/home/user/my_project:/home/user/my_project/libs
Trong ví dụ này, hai đường dẫn được thêm vào PYTHONPATH: /home/user/my_project và /home/user/my_project/libs, cho phép Python tìm kiếm các module trong những thư mục này.
Việc sử dụng PYTHONPATH cùng với tệp .env mang lại nhiều lợi ích cho quá trình phát triển phần mềm, đặc biệt khi làm việc với các dự án lớn và có nhiều thư viện hoặc module phức tạp.
PYTHONPATH và tệp .env là những công cụ mạnh mẽ giúp quản lý môi trường trong Python một cách linh hoạt và bảo mật. Chúng hỗ trợ tối ưu hóa quy trình phát triển và triển khai phần mềm, đặc biệt đối với những dự án lớn hoặc đa môi trường.
PYTHONPATH và tệp .env là những công cụ mạnh mẽ giúp quản lý môi trường trong Python một cách linh hoạt và bảo mật. Chúng hỗ trợ tối ưu hóa quy trình phát triển và triển khai phần mềm, đặc biệt đối với những dự án lớn hoặc đa môi trường.
XEM THÊM:
PYTHONPATH là một biến môi trường trong Python, được sử dụng để xác định các thư mục mà trình thông dịch Python sẽ tìm kiếm khi nhập (import) các module. Điều này giúp lập trình viên quản lý và tổ chức mã nguồn hiệu quả, đặc biệt trong các dự án lớn.
Khi bạn chạy một tập lệnh Python, trình thông dịch sẽ kiểm tra các thư mục được liệt kê trong biến PYTHONPATH theo thứ tự ưu tiên. Nếu không tìm thấy module trong các thư mục này, nó sẽ trả về lỗi ModuleNotFoundError.
Để kiểm tra hoặc thiết lập PYTHONPATH, bạn có thể sử dụng lệnh sau trên hệ điều hành:
Trong một số trường hợp phức tạp hơn, PYTHONPATH còn được sử dụng trong môi trường ảo (virtual environment) hoặc Docker để tạo ra các không gian làm việc riêng biệt.
Môi trường ảo (virtual environment) là một tính năng quan trọng trong Python, giúp tách biệt các dự án với nhau và đảm bảo rằng các phiên bản thư viện, module không xung đột giữa các dự án khác nhau. Khi làm việc với môi trường ảo, bạn có thể cài đặt các phiên bản thư viện khác nhau cho từng dự án mà không ảnh hưởng đến hệ thống hoặc các dự án khác.
Dưới đây là các bước thiết lập và sử dụng môi trường ảo:
Sau khi kích hoạt, bạn có thể cài đặt các thư viện cần thiết mà không ảnh hưởng đến các môi trường khác:
Để thoát khỏi môi trường ảo, bạn chỉ cần gõ lệnh:
Môi trường ảo rất hữu ích khi làm việc với các dự án lớn, giúp quản lý phiên bản thư viện và module một cách hiệu quả. Việc sử dụng virtual environment là một phương pháp tốt để duy trì tính tương thích và tránh các lỗi do xung đột thư viện.
Trong các dự án Python, việc cấu hình biến môi trường (environment variables) là một bước quan trọng để kiểm soát và quản lý các cài đặt mà không cần thay đổi mã nguồn. Biến PYTHONPATH giúp chỉ định các thư mục mà Python sẽ tìm kiếm các module và package.
Dưới đây là cách cấu hình biến môi trường PYTHONPATH trong dự án Python:
Trong Python, bạn cũng có thể thiết lập PYTHONPATH tạm thời trong mã bằng cách sử dụng module sys:
import sys
sys.path.append(‘thư_mục_của_bạn’)
Điều này thêm thư mục tùy chỉnh vào danh sách các thư mục mà Python tìm kiếm module.
Bạn có thể lưu các biến môi trường vào một tệp .env để quản lý dễ dàng hơn, đặc biệt khi làm việc với nhiều môi trường phát triển.
Việc cấu hình PYTHONPATH giúp linh hoạt hơn trong quá trình phát triển, cho phép kiểm soát các thư viện và module mà dự án cần truy cập mà không phụ thuộc hoàn toàn vào hệ thống thư mục mặc định của Python.
XEM THÊM:
Sử dụng PYTHONPATH trong các môi trường phát triển tích hợp (IDE) như PyCharm, VSCode là một cách hiệu quả để cấu hình và quản lý các đường dẫn module cho các dự án Python.
Việc sử dụng đúng PYTHONPATH trong IDE giúp dễ dàng quản lý các thư viện bên ngoài và cải thiện hiệu suất làm việc trong dự án Python.
Việc cấu hình biến môi trường PYTHONPATH có thể gặp nhiều vấn đề, đặc biệt là khi làm việc với các dự án lớn và môi trường ảo. Dưới đây là một số vấn đề phổ biến và cách khắc phục:
Việc cấu hình đúng PYTHONPATH giúp đảm bảo rằng chương trình Python có thể tìm và nạp các module một cách chính xác.
Python là ngôn ngữ lập trình phổ biến và mạnh mẽ, thích hợp cho cả người mới bắt đầu và lập trình viên chuyên nghiệp. Dưới đây là 10 dạng bài tập Python kèm lời giải giúp bạn củng cố kiến thức và kỹ năng lập trình:
Những bài tập trên giúp bạn thực hành các khái niệm cơ bản của Python và phát triển kỹ năng lập trình một cách hiệu quả.
XEM THÊM:
Trong bài tập này, chúng ta sẽ viết một hàm để tính tổng các số lẻ trong một danh sách (list) các số nguyên. Hàm này sẽ nhận vào một danh sách các số và trả về tổng của các số lẻ có trong danh sách.
Dưới đây là các bước thực hiện:
Dưới đây là mã Python cho bài toán này:
def tong_so_le(lst):
# Khởi tạo biến tổng là 0
tong = 0
# Duyệt qua từng phần tử trong danh sách
for so in lst:
# Kiểm tra nếu số là lẻ
if so % 2 != 0:
# Cộng số lẻ vào biến tổng
tong += so
# Trả về tổng các số lẻ
return tong
# Ví dụ sử dụng hàm:
ds_so = [1, 2, 3, 4, 5]
ket_qua = tong_so_le(ds_so)
print(“Tổng các số lẻ là:”, ket_qua)
Giải thích mã:
Ví dụ đầu ra:
Tổng các số lẻ là: 9
Bài tập này giúp bạn rèn luyện kỹ năng duyệt qua danh sách và sử dụng các điều kiện trong Python để thực hiện các phép tính trên phần tử của danh sách.
Trong bài tập này, chúng ta sẽ viết một hàm kiểm tra xem một chuỗi có phải là chuỗi đối xứng hay không. Chuỗi đối xứng (hay còn gọi là “palindrome”) là chuỗi có thứ tự các ký tự từ trái sang phải giống như từ phải sang trái.
Dưới đây là các bước chi tiết để giải quyết bài toán:
Dưới đây là đoạn code mẫu:
def kiem_tra_doi_xung(s):
# Loại bỏ khoảng trắng và chuyển về chữ thường
s = s.replace(” “, “”).lower()
# So sánh chuỗi với chuỗi đảo ngược
if s == s[::-1]:
return True
else:
return False
Ví dụ:
Giải thích: Trong đoạn mã trên, chúng ta sử dụng s[::-1] để đảo ngược chuỗi. Sau đó, so sánh chuỗi ban đầu với chuỗi đảo ngược. Nếu hai chuỗi giống nhau, hàm trả về True, ngược lại trả về False.
Một số chú ý:
Bài tập này giúp bạn làm quen với việc thao tác chuỗi trong Python và áp dụng các phương pháp cắt chuỗi (slicing).
Trong bài này, chúng ta sẽ viết một hàm trong Python để tìm các số nguyên tố trong một dãy số. Một số nguyên tố là số tự nhiên lớn hơn 1 và chỉ chia hết cho 1 và chính nó.
Dưới đây là các bước thực hiện:
Dưới đây là đoạn mã Python để thực hiện yêu cầu:
def kiem_tra_so_nguyen_to(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
def tim_so_nguyen_to_trong_day(day_so):
ket_qua = []
for so in day_so:
if kiem_tra_so_nguyen_to(so):
ket_qua.append(so)
return ket_qua
# Ví dụ sử dụng
day_so = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
so_nguyen_to = tim_so_nguyen_to_trong_day(day_so)
print(so_nguyen_to)
Giải thích:
Với dãy số đầu vào [2, 3, 4, 5, 6, 7, 8, 9, 10, 11], kết quả trả về sẽ là danh sách các số nguyên tố [2, 3, 5, 7, 11].
Đây là một cách đơn giản và hiệu quả để tìm kiếm số nguyên tố trong một dãy số bằng Python. Bạn có thể áp dụng kỹ thuật này trong các dự án Python khác nhau để xử lý các bài toán liên quan đến số nguyên tố.
XEM THÊM:
Trong lập trình Python, việc tạo môi trường ảo (Virtual Environment) là bước quan trọng giúp bạn quản lý các gói (packages) và thư viện mà không làm ảnh hưởng đến hệ thống hoặc các dự án khác. Dưới đây là các bước chi tiết để tạo một môi trường ảo và cài đặt một package.
Bước 1: Cài đặt công cụ tạo môi trường ảo
Có hai công cụ chính để tạo môi trường ảo trong Python là venv và virtualenv. Ở đây, chúng ta sẽ sử dụng virtualenv. Đầu tiên, bạn cần cài đặt công cụ này bằng lệnh sau:
pip install virtualenv
Bước 2: Tạo môi trường ảo
Sau khi cài đặt xong virtualenv, bạn có thể tạo một môi trường ảo bằng lệnh:
virtualenv ten_moi_truong
Ví dụ:
virtualenv my_env
Lệnh này sẽ tạo một thư mục chứa môi trường ảo cho dự án của bạn.
Bước 3: Kích hoạt môi trường ảo
Để kích hoạt môi trường ảo, bạn cần chạy lệnh sau:
my_env\Scripts\activate
Sau khi kích hoạt thành công, bạn sẽ thấy tên của môi trường ảo xuất hiện trước dấu nhắc lệnh, ví dụ: (my_env).
Bước 4: Cài đặt một package
Sau khi môi trường ảo đã được kích hoạt, bạn có thể cài đặt các gói Python cần thiết bằng lệnh pip. Ví dụ, để cài đặt gói requests, bạn sử dụng lệnh:
pip install requests
Bạn có thể kiểm tra các gói đã cài đặt bằng lệnh:
pip list
Bước 5: Tắt môi trường ảo
Khi không cần sử dụng môi trường ảo nữa, bạn có thể tắt nó bằng lệnh:
deactivate
Môi trường ảo sẽ tắt và bạn sẽ trở lại môi trường hệ thống thông thường.
Như vậy, bạn đã hoàn thành quá trình tạo một môi trường ảo và cài đặt một package trong Python. Việc sử dụng môi trường ảo giúp quản lý dễ dàng các phiên bản của gói và không gây xung đột giữa các dự án.
Trong bài này, chúng ta sẽ thực hiện việc đọc dữ liệu từ một file CSV và sắp xếp dữ liệu này theo một tiêu chí cụ thể. Bạn có thể sử dụng thư viện csv hoặc pandas để thực hiện bài tập này.
Đầu tiên, chúng ta cần mở và đọc nội dung của file CSV bằng cách sử dụng csv.reader(). Dưới đây là ví dụ về cách đọc file CSV:
import csv
with open(‘data.csv’, mode=”r”) as file:
reader = csv.reader(file)
data = list(reader)
for row in data:
print(row)
File CSV sẽ được đọc và lưu trữ trong biến data dưới dạng danh sách của các hàng.
Tiếp theo, chúng ta có thể sắp xếp dữ liệu dựa trên một cột cụ thể. Giả sử cột thứ hai (index = 1) chứa các giá trị mà ta muốn sắp xếp:
data_sorted = sorted(data[1:], key=lambda x: x[1])
print(data_sorted)
Dữ liệu sẽ được sắp xếp và in ra màn hình.
Thư viện pandas giúp xử lý dữ liệu dễ dàng hơn, đặc biệt với các file CSV lớn. Để đọc dữ liệu từ file CSV, bạn có thể sử dụng:
import pandas as pd
df = pd.read_csv(‘data.csv’)
print(df.head()) # In 5 hàng đầu tiên của file CSV
Để sắp xếp dữ liệu theo một cột, ví dụ cột “age”, bạn có thể làm như sau:
df_sorted = df.sort_values(by=’age’)
print(df_sorted)
Kết quả là bảng dữ liệu được sắp xếp theo cột “age”.
Sau khi sắp xếp, nếu muốn lưu dữ liệu vào một file CSV mới, bạn có thể sử dụng:
df_sorted.to_csv(‘sorted_data.csv’, index=False)
Bài tập này giúp bạn làm quen với việc thao tác và sắp xếp dữ liệu từ file CSV, một kỹ năng quan trọng khi làm việc với dữ liệu lớn. Bạn có thể lựa chọn giữa việc sử dụng csv để xử lý dữ liệu nhỏ hoặc pandas để xử lý dữ liệu lớn hơn một cách hiệu quả.
Trong quá trình phát triển ứng dụng, việc kết nối tới API có thể gặp nhiều lỗi do các vấn đề về kết nối mạng, cấu hình hoặc phản hồi không mong đợi từ phía máy chủ. Để đảm bảo chương trình vẫn hoạt động ổn định, chúng ta cần xây dựng hàm xử lý lỗi khi kết nối API. Dưới đây là các bước cụ thể để thực hiện việc này:
Chúng ta có thể sử dụng khối try/catch để bắt các lỗi xảy ra trong quá trình gọi API. Khi xảy ra lỗi, khối catch sẽ được thực thi, nơi chúng ta có thể log lỗi hoặc thông báo cho người dùng.
async function fetchData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error(‘Error fetching data:’, error);
return null;
}
}
Sau khi nhận được phản hồi từ API, chúng ta cần kiểm tra mã trạng thái HTTP để đảm bảo rằng yêu cầu đã được xử lý thành công (mã trạng thái 2xx). Nếu mã trạng thái không phải là 2xx, chúng ta cần ném lỗi và xử lý nó trong khối catch.
Một lỗi phổ biến là mất kết nối mạng. Để xử lý trường hợp này, chúng ta có thể sử dụng bộ hủy yêu cầu (AbortController) để hủy các yêu cầu quá lâu hoặc không cần thiết.
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5000);
async function fetchDataWithTimeout(url) {
try {
const response = await fetch(url, { signal: controller.signal });
clearTimeout(timeout);
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error(‘Request aborted or other error:’, error);
return null;
}
}
Cuối cùng, để cải thiện trải nghiệm người dùng, chúng ta nên thông báo rõ ràng khi có lỗi xảy ra, ví dụ như “Mất kết nối mạng, vui lòng kiểm tra lại” hoặc “Không thể kết nối tới máy chủ, thử lại sau”.
Việc xử lý lỗi khi kết nối API là một phần quan trọng giúp ứng dụng trở nên ổn định và thân thiện với người dùng. Thông qua việc sử dụng try/catch, kiểm tra mã trạng thái và xử lý lỗi mạng, chúng ta có thể cải thiện đáng kể độ tin cậy của ứng dụng khi tương tác với API.
Trong Python, việc sử dụng file .env giúp quản lý các biến môi trường một cách dễ dàng và bảo mật. File .env thường chứa các giá trị như thông tin kết nối cơ sở dữ liệu, API keys và các biến quan trọng khác mà bạn không muốn lưu trực tiếp trong mã nguồn.
VARIABLE_NAME=giá trị
Ví dụ:
Để đọc các biến môi trường từ file .env trong Python, bạn cần cài đặt thư viện python-dotenv bằng cách sử dụng lệnh sau:
pip install python-dotenv
# Load file .env
load_dotenv()
# Lấy giá trị của biến môi trường
secret_key = os.getenv(‘SECRET_KEY’)
db_url = os.getenv(‘DATABASE_URL’)
print(f’Secret Key: {secret_key}’)
print(f’Database URL: {db_url}’)
Trong bài này, chúng ta sẽ tìm hiểu cách tạo và xử lý file JSON bằng Python. Dưới đây là các bước chi tiết để thực hiện.
JSON là một định dạng dữ liệu phổ biến để lưu trữ và trao đổi thông tin. Trong Python, bạn có thể sử dụng module json để làm việc với file JSON. Dưới đây là cách tạo một file JSON đơn giản:
import json
# Dữ liệu muốn lưu dưới dạng JSON
data = {
“name”: “John Doe”,
“age”: 30,
“city”: “Hà Nội”
}
# Mở file để ghi dữ liệu
with open(“data.json”, “w”) as json_file:
json.dump(data, json_file)
Ở đây, chúng ta sử dụng hàm json.dump() để ghi dữ liệu vào file JSON. Dữ liệu sẽ được lưu trữ dưới dạng file data.json.
Sau khi đã tạo file JSON, chúng ta có thể đọc dữ liệu từ file đó bằng cách sử dụng hàm json.load(). Dưới đây là ví dụ:
import json
# Mở file JSON và đọc nội dung
with open(“data.json”, “r”) as json_file:
data = json.load(json_file)
# In ra nội dung của file
print(data)
Hàm json.load() sẽ phân tích cú pháp nội dung của file JSON và trả về một đối tượng Python (như dict).
Khi dữ liệu JSON đã được tải vào chương trình, bạn có thể thao tác với nó như với một đối tượng Python thông thường. Ví dụ, bạn có thể truy xuất các giá trị trong JSON như sau:
# Truy xuất thông tin từ đối tượng JSON
print(“Tên:”, data[“name”])
print(“Tuổi:”, data[“age”])
print(“Thành phố:”, data[“city”])
Nếu bạn muốn cập nhật dữ liệu trong file JSON, bạn có thể sửa đổi đối tượng Python và sau đó ghi đè dữ liệu mới vào file như sau:
# Cập nhật thông tin trong đối tượng JSON
data[“age”] = 31
# Ghi lại dữ liệu vào file
with open(“data.json”, “w”) as json_file:
json.dump(data, json_file)
Qua bài này, bạn đã học cách tạo, đọc và xử lý file JSON trong Python. Việc lưu trữ dữ liệu dưới dạng JSON rất hữu ích khi làm việc với dữ liệu lớn hoặc cần trao đổi dữ liệu giữa các hệ thống.
Flask là một framework web phổ biến của Python, và khi phát triển ứng dụng với Flask, việc sử dụng một môi trường ảo (Virtual Environment) sẽ giúp bạn cô lập các gói cài đặt, tránh xung đột với các dự án khác. Sau đây là các bước chi tiết để tạo một dự án Flask sử dụng Virtual Environment.
Bước 1: Cài đặt Virtual Environment
Trước tiên, bạn cần cài đặt gói virtualenv nếu chưa có:
pip install virtualenv
Bước 2: Tạo Môi Trường Ảo
Sau khi cài đặt, hãy tạo môi trường ảo bằng lệnh:
virtualenv myenv
Ở đây, myenv là tên của môi trường ảo. Bạn có thể thay đổi tên tùy ý.
Bước 3: Kích Hoạt Môi Trường Ảo
Kích hoạt môi trường ảo bằng lệnh:
Khi kích hoạt thành công, bạn sẽ thấy tên của môi trường ảo hiển thị ở dòng lệnh.
Bước 4: Cài Đặt Flask
Với môi trường ảo đã kích hoạt, bạn có thể cài đặt Flask bằng lệnh:
pip install flask
Flask sẽ được cài đặt chỉ trong môi trường ảo này, đảm bảo không ảnh hưởng đến các dự án khác.
Bước 5: Tạo File Flask App
Tạo một file app.py và thêm đoạn mã Flask cơ bản:
from flask import Flask
app = Flask(__name__)
@app.route(“https://rdsic.edu.vn/”)
def hello_world():
return ‘Hello, Flask!’
if __name__ == ‘__main__’:
app.run()
Bước 6: Chạy Ứng Dụng Flask
Chạy ứng dụng Flask với lệnh:
python app.py
Bây giờ, bạn có thể truy cập ứng dụng qua địa chỉ http://127.0.0.1:5000.
Bước 7: Vô Hiệu Hóa Môi Trường Ảo
Sau khi hoàn tất công việc, bạn có thể vô hiệu hóa môi trường ảo bằng lệnh:
deactivate
Như vậy, bạn đã hoàn thành việc tạo một dự án Flask cơ bản sử dụng Virtual Environment, giúp cô lập môi trường phát triển và dễ dàng quản lý các gói cài đặt.
Khi làm việc với nhiều module Python trong các dự án lớn, việc quản lý đường dẫn tới các module và thư viện trở nên cần thiết. Sử dụng PYTHONPATH là một cách hiệu quả để mở rộng khả năng tìm kiếm module của Python, giúp bạn dễ dàng kiểm soát và tích hợp nhiều phần của dự án.
PYTHONPATH là một biến môi trường dùng để chỉ định danh sách các thư mục mà Python sẽ tìm kiếm các module. Bất kỳ thư mục nào nằm trong PYTHONPATH đều có thể chứa các module Python và sẽ được ưu tiên khi bạn thực hiện lệnh import.
Giả sử bạn có cấu trúc thư mục như sau:
/my_project/
main.py
/libs/
module1.py
module2.py
Bạn muốn sử dụng các module trong thư mục libs mà không cần phải di chuyển chúng. Hãy thiết lập PYTHONPATH như sau:
export PYTHONPATH=/path/to/my_project/libs
Sau đó, trong main.py, bạn có thể import các module như:
import module1
import module2
Sử dụng PYTHONPATH là một giải pháp tiện lợi và mạnh mẽ cho việc quản lý nhiều module Python, đặc biệt trong các dự án lớn. Nó không chỉ giúp giảm bớt sự trùng lặp mà còn giúp quá trình phát triển trở nên linh hoạt hơn, dễ dàng tùy chỉnh cho các môi trường khác nhau.
Giáo sư Nguyễn Lân Dũng là nhà khoa học hàng đầu Việt Nam trong lĩnh vực vi sinh vật học (wiki), với hơn nửa thế kỷ cống hiến cho giáo dục và nghiên cứu. Ông là con trai Nhà giáo Nhân dân Nguyễn Lân, thuộc gia đình nổi tiếng hiếu học. Giáo sư giữ nhiều vai trò quan trọng như Chủ tịch Hội các ngành Sinh học Việt Nam, Đại biểu Quốc hội và đã được phong tặng danh hiệu Nhà giáo Nhân dân năm 2010.
Nhiều bạn không phân biệt được che dấu hay che giấu từ nào đúng chính…
CO2 là gì? Có lẽ tất cả chúng ta đều biết về khí CO2. Tuy…
Sài tiền hay xài tiền mới là cách viết đúng, hiện nay nhiều người vẫn…
Khí than ướt hay còn gọi là khí chứa hơi ẩm sinh ra từ quá…
Liên hệ mở rộng Mùa xuân nho nhỏ là cách hay giúp bạn hiểu rõ hơn…
VOC là gì? Ngày nay, ô nhiễm môi trường là một trong những vấn đề…
This website uses cookies.