Các lời gọi sau tạo ra hai tiến trình shell riêng biệt:

os.system('unset http_proxy')
os.system('curl https://example.com/')

Shell thứ nhất xóa một biến khỏi môi trường của chính nó rồi thoát. Tiến trình Python vẫn giữ giá trị ban đầu. Shell thứ hai lại kế thừa giá trị đó.

Trao cho tiến trình con môi trường mà bạn muốn

Khi chỉ một lệnh cần chạy mà không kế thừa các biến proxy, hãy sao chép môi trường của Python và truyền bản sao cho tiến trình con:

import os
import subprocess

env = os.environ.copy()
for name in ('http_proxy', 'https_proxy', 'all_proxy',
             'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY'):
    env.pop(name, None)
subprocess.run(['curl', '--proxy', '', 'https://example.com/'],
               env=env, check=True)

Thiết lập proxy rỗng tường minh của curl cũng ghi đè lựa chọn proxy từ cấu hình riêng của curl. Bản sao môi trường giữ lại các giá trị khác mà lệnh có thể cần. Truyền môi trường rỗng thay vào đó có thể xóa các đường dẫn tìm kiếm tệp thực thi và cấu hình ứng dụng không liên quan.

Với các thao tác tiếp theo trong chính tiến trình Python, hãy thay đổi os.environ một cách có chủ đích. Điều đó ảnh hưởng đến những gì tiến trình con mới tạo kế thừa; nó không ghi đè môi trường của terminal cha và không nhất thiết cấu hình lại các ứng dụng HTTP đã ghi nhận thiết lập của chúng.

API subprocess mô tả đối số env, và os.environ mô tả môi trường tiến trình của Python. Chính các phạm vi này là lý do một lệnh shell có thể báo thành công trong khi yêu cầu tiếp theo vẫn dùng proxy cũ.

Cuối cùng, hãy kiểm tra ứng dụng mà bạn thực sự đang chạy. Biến môi trường chỉ là một đầu vào cấu hình. tùy chọn proxy tường minh hoặc cấu hình riêng của ứng dụng có thể tiếp tục chọn proxy sau khi các biến đó không còn nữa.

Bài viết liên quan