Οι παρακάτω κλήσεις δημιουργούν δύο ξεχωριστές διεργασίες κελύφους:

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

Το πρώτο κέλυφος αφαιρεί μια μεταβλητή από το δικό του περιβάλλον και τερματίζεται. Η διεργασία Python έχει ακόμη την αρχική τιμή. Το δεύτερο κέλυφος την κληρονομεί ξανά.

Δώστε στο παιδί το περιβάλλον που είχατε κατά νου

Όταν μόνο μία εντολή πρέπει να εκτελεστεί χωρίς κληρονομημένες μεταβλητές διακομιστή μεσολάβησης, αντιγράψτε το περιβάλλον της Python και περάστε το αντίγραφο στο παιδί:

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)

Η ρητή κενή ρύθμιση διακομιστή μεσολάβησης του curl υπερισχύει επίσης της επιλογής διακομιστή μεσολάβησης από τη δική του διαμόρφωση του curl. Το αντίγραφο περιβάλλοντος διατηρεί άλλες τιμές που μπορεί να χρειάζεται η εντολή. Η μετάβαση κενού περιβάλλοντος αντί αυτού μπορεί να αφαιρέσει διαδρομές αναζήτησης εκτελέσιμων και άσχετη διαμόρφωση εφαρμογής.

Για επόμενες λειτουργίες στην ίδια τη διεργασία Python, αλλάξτε συνειδητά το os.environ. Αυτό επηρεάζει τι κληρονομούν τα νεοδημιουργημένα παιδιά· δεν ξαναγράφει το περιβάλλον του γονικού τερματικού ούτε ρυθμίζει απαραίτητα ξανά πελάτες HTTP που έχουν ήδη καταγράψει τις ρυθμίσεις τους.

Το API subprocess τεκμηριώνει το όρισμα env, και το os.environ περιγράφει το περιβάλλον διεργασίας της Python. Αυτά τα πεδία είναι ο λόγος που μια εντολή κελύφους μπορεί να αναφέρει επιτυχία ενώ το επόμενο αίτημα χρησιμοποιεί ακόμη τον παλιό διακομιστή μεσολάβησης.

Τέλος, ελέγξτε τον πελάτη που εκτελείτε πραγματικά. Οι μεταβλητές περιβάλλοντος είναι μία είσοδος διαμόρφωσης. Μια ρητή επιλογή διακομιστή μεσολάβησης ή η διαμόρφωση της ίδιας της εφαρμογής μπορεί να συνεχίσει να επιλέγει διακομιστή μεσολάβησης αφού αυτές οι μεταβλητές εξαφανιστούν.

Σχετικά άρθρα