Python subprocess.run: δώστε σε ένα θυγατρικό πρόγραμμα το δικό του περιβάλλον διαμεσολαβητή
Περάστε ένα αντιγραμμένο περιβάλλον στο subprocess.run όταν μία θυγατρική εντολή χρειάζεται διαμεσολαβητή χωρίς να αλλάξετε το περιβάλλον της Python για άλλη εργασία.
Ένα πρόγραμμα Python μπορεί να δώσει σε μία θυγατρική εντολή το δικό της περιβάλλον διαμεσολαβητή. Αντιγράψτε τις κληρονομημένες τιμές, αλλάξτε το αντίγραφο και περάστε το στο subprocess.run:
import os
import subprocess
child_env = os.environ.copy()
child_env["https_proxy"] = "http://proxy.example:8080"
subprocess.run(
["curl", "--head", "https://www.example.com/"],
env=child_env,
check=True,
timeout=30,
)Το παράδειγμα υποθέτει ότι το curl είναι ήδη διαθέσιμο. Το αίτημα HTTPS του μπορεί να χρησιμοποιήσει διαμεσολαβητή HTTP που υποστηρίζει τη σήραγγα που απαιτείται. Για αυτόν τον έλεγχο δημόσιου ιστότοπου χωρίς ρυθμισμένα διαπιστευτήρια διαμεσολαβητή, ένας υποψήφιος από τη λίστα διαμεσολαβητών HTTP μπορεί να αντικαταστήσει το τελικό σημείο του παραδείγματος. Το θυγατρικό πρόγραμμα εξακολουθεί να λαμβάνει το υπόλοιπο αντιγραμμένο περιβάλλον, μαζί με τυχόν ισχύουσες ρυθμίσεις παράκαμψης.
Η μετάδοση του env δίνει σε αυτή την κλήση εκείνο το περιβάλλον. Το αντίγραφο αποφεύγει την αλλαγή του os.environ για άλλη εργασία στη διεργασία Python.
Η απευθείας ανάθεση στο os.environ έχει επίσης νόημα: ενημερώνει το περιβάλλον της διεργασίας Python και μπορεί να επηρεάσει θυγατρικά προγράμματα που ξεκινούν στη συνέχεια. Δεν ενημερώνει το κέλυφος που ξεκίνησε την Python, ούτε μια άσχετη εφαρμογή, ούτε ένα θυγατρικό πρόγραμμα που εκτελείται ήδη.
Αν σκοπός είναι να αλλάξετε μελλοντικές εντολές στο διαδραστικό σας κέλυφος, κάντε αυτή την αλλαγή στο κέλυφος. Αν μόνο ένα εργαλείο που ξεκινήσατε χρειάζεται διαφορετική διαδρομή, κρατήστε το περιβάλλον του δίπλα στην κλήση subprocess, όπως φαίνεται.