Apakšprocesa palaišanas metode
Subprocess.run metode ņem argumentu sarakstu. Kad metode tiek izsaukta, tā izpilda komandu un gaida procesa pabeigšanu, beigās atgriežot objektu CompletedProcess. Objekts CompletedProcess atgriež stdout, stderr, sākotnējos argumentus, kas izmantoti, izsaucot metodi, un atgriešanās kodu. Stdout attiecas uz komandas izveidoto datu plūsmu, bet stderr attiecas uz kļūdām, kas radušās programmas izpildes laikā. Jebkurš atgriešanās kods, kas nav nulle (izejas kods), nozīmētu kļūdu ar komandu, kas izpildīta subprocess.run metodē.
1. piemērs. Teksta faila izvades saturs, izmantojot metodi Subprocess.run
Tālāk esošā komanda izvadīs faila data.txt saturu, pieņemot, ka tajā ir vārds = Jāņa virkne.
importēt apakšprocess
apakšprocess.skriet(['kaķis', 'data.txt'])
Palaižot iepriekš minēto kodu, tiks parādīta šāda izvade:
vārds=Džons
PabeigtsProcess(args=['kaķis', 'data.txt'],atgriešanās kods=0)
Saraksta argumenta pirmais elements ir izpildāmās komandas nosaukums. Jebkurš saraksta elements, kas seko pirmajam elementam, tiek uzskatīts par komandrindas opcijām vai slēdžiem. Lai definētu opcijas, varat izmantot arī vienu domuzīmi un dubultās svītras. Piemēram, lai uzskaitītu direktorijā esošos failus un mapes, kods būtu subprocess.run ([ls, -l]. Vairumā gadījumu jebkuru ar atdalītu argumentu apvalka komandā varat uzskatīt par atsevišķu elementu apakšprocess.run metodei piegādātais saraksts.
2. piemērs. Apakšprocesa izpildes metodes izvades apturēšana
Lai apspiestu metodes subprocess.run izvadi, jums kā papildu argumenti būs jānorāda stdout = subprocess.DEVNULL un stderr = subprocess.DEVNULL.
importēt apakšprocessapakšprocess.skriet(['kaķis', 'data.txt'],stdout=apakšprocess.DEVNULL,
stderr=apakšprocess.DEVNULL)
Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:
CompletedProcess (args = ['kaķis', 'data.txt'], atgriešanās kods = 0)
3. piemērs: Subprocess.run metodes uztveršanas izvade
Lai attēlotu metodes subprocess.run izvadi, izmantojiet papildu argumentu ar nosaukumu capture_output = True.
importēt apakšprocessizvade= apakšprocess.skriet(['kaķis', 'data.txt'],uztveršanas_izvade=Taisnība)
drukāt (izvade)
Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:
PabeigtsProcess(args=['kaķis', 'data.txt'],atgriešanās kods=0,stdout=b'vārds = Jānis n',stderr=b'')
Jūs varat individuāli piekļūt stdout un stderr vērtībām, izmantojot metodes output.stdout un output.stderr. Izeja tiek veidota kā baitu secība. Lai iegūtu virkni kā izvadi, izmantojiet metodi output.stdout.decode (utf-8). Jūs varat arī pievienot tekstu = True kā papildu argumentu apakšprocesa.run izsaukumam, lai iegūtu izvadi virknes formātā. Lai iegūtu izejas statusa kodu, varat izmantot metodi output.returncode.
4. piemērs. Palieliniet izņēmumu, ja komanda nav izpildīta, izmantojot apakšprocesa palaišanas metodi
Lai paaugstinātu izņēmumu, kad komanda iziet ar statusu, kas nav nulle, izmantojiet argumentu check = True.
importēt apakšprocessapakšprocess.skriet(['kaķis', 'data.tx'],uztveršanas_izvade=Taisnība,teksts=Taisnība,pārbaudiet=Taisnība)
Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:
paaugstināt CalledProcessError (retcode, process.args,apakšprocess.ConedProcessError: Komanda '[' cat ',' data.tx ']'
atgriezts izejas statuss, kas nav nulle 1.
5. piemērs: nododiet virkni komandai, kas tiek izpildīta ar metodi Subprocess.run
Jūs varat nodot virkni komandai, kas jāizpilda, izmantojot metodi subprocess.run, izmantojot argumentu input = ’string’.
importēt apakšprocessizvade= apakšprocess.skriet(['kaķis'], ievadi='data.txt',uztveršanas_izvade=Taisnība,
teksts=Taisnība,pārbaudiet=Taisnība)
drukāt (izvade)
Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:
CompletedProcess (args = ['kaķis'], atgriešanās kods = 0, stdout = 'data.txt', stderr = '')Kā redzat, iepriekš minētais kods nodod failu data.txt kā virkni, nevis kā faila objektu. Lai nodotu failu data.txt kā failu, izmantojiet argumentu stdin.
ar atvērts('data.txt') kāf:izvade= apakšprocess.skriet(['kaķis'],stdin=f,uztveršanas_izvade=Taisnība,
teksts=Taisnība,pārbaudiet=Taisnība)
drukāt (izvade)
Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:
PabeigtsProcess (args = ['cat'], returncode = 0, stdout = 'name = John n', stderr = '')6. piemērs. Izpildiet komandu tieši čaulā, izmantojot metodi Subprocess.run
Ir iespējams palaist komandu tieši čaulā, kā tas ir, nevis izmantot virknes sadalījumu galvenajā komandā un tai sekojošās opcijās. Lai to izdarītu, kā papildu arguments jānodod shell = True. Tomēr python izstrādātāji to attur, jo, izmantojot shell = True, var rasties drošības problēmas. Jūs varat lasīt vairāk par ietekmi uz drošību no šeit .
importēt apakšprocessapakšprocess.skriet('kaķis' data.txt '',apvalks=Taisnība)
Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:
vārds = JānisSecinājums
Subprocess.run metode Python ir diezgan spēcīga, jo tā ļauj palaist čaulas komandas pašā python. Tas palīdz ierobežot visu kodu līdz pašam python, bez papildu čaulas skripta koda nepieciešamības atsevišķos failos. Tomēr var būt diezgan sarežģīti pareizi marķēt čaulas komandas python sarakstā. Jūs varat izmantot shlex.split () metodi, lai marķētu vienkāršas čaulas komandas, bet garās, sarežģītās komandās - īpaši tajās, kurās ir cauruļu simboli - shlex nespēj pareizi sadalīt komandu. Šādos gadījumos atkļūdošana var būt sarežģīta problēma. Lai to izvairītos, varat izmantot argumentu shell = True, taču ar šo darbību ir saistītas dažas drošības problēmas.