Pam nad yw os.system("unset http_proxy") yn newid dim
Tynnwch newidyn dirprwy o'r broses Python gywir neu rhowch amgylchedd rheoledig i orchymyn plentyn.
Mae'r galwadau canlynol yn creu dau broses plisgyn ar wahân:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Mae'r plisgyn cyntaf yn tynnu newidyn o'i amgylchedd ei hun ac yn gorffen. Mae gan y broses Python y gwerth gwreiddiol o hyd. Mae'r ail blisgyn yn ei etifeddu eto.
Rhowch yr amgylchedd y gwnaethoch ei fwriadu i'r plentyn
Pan mai dim ond un gorchymyn ddylai redeg heb newidynnau dirprwy etifeddol, copïwch amgylchedd Python a rhowch y copi i'r plentyn:
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)
Mae gosodiad dirprwy gwag penodol curl hefyd yn diystyru'r dewis dirprwy o ffurfweddiad curl ei hun. Mae copi'r amgylchedd yn cadw gwerthoedd eraill y gallai'r gorchymyn eu hangen. Mae trosglwyddo amgylchedd gwag yn lle hynny yn gallu tynnu llwybrau chwilio gweithredadwy a ffurfweddiad cymhwysiad digyswllt.
Ar gyfer gweithrediadau dilynol o fewn y broses Python ei hun, newidiwch os.environ yn fwriadol. Mae hyn yn effeithio ar yr hyn y mae plant newydd eu creu yn ei etifeddu; nid yw'n ailysgrifennu amgylchedd y derfynell rhiant nac o reidrwydd yn ailffurfweddu cleientiaid HTTP sydd eisoes wedi dal eu gosodiadau.
API subprocess yn dogfennu'r dadl env, ac mae os.environ yn disgrifio amgylchedd proses Python. Y cwmpasau hyn yw'r rheswm y gall gorchymyn plisgyn adrodd llwyddiant tra bod y cais nesaf yn dal i ddefnyddio'r hen ddirprwy.
Yn olaf, gwiriwch y cleient rydych chi'n ei redeg mewn gwirionedd. Mae newidynnau amgylchedd yn un mewnbwn ffurfweddu. Gall opsiwn dirprwy penodol neu ffurfweddiad cymhwysiad ei hun barhau i ddewis dirprwy ar ôl i'r newidynnau hynny ddiflannu.