Subprocess.run -menetelmä
Subprocess.run -menetelmä ottaa luettelon argumentteja. Kun menetelmä kutsutaan, se suorittaa komennon ja odottaa prosessin päättymistä ja palauttaa lopuksi CompletedProcess -objektin. CompletedProcess -objekti palauttaa stdout, stderr, alkuperäiset argumentit, joita käytettiin menetelmän kutsumisen yhteydessä, ja palautuskoodi. Stdout viittaa komennon tuottamaan tietovirtaan, kun taas stderr viittaa mahdollisiin virheisiin, jotka ilmenevät ohjelman suorittamisen aikana. Mikä tahansa nollasta poikkeava palautuskoodi (poistumiskoodi) merkitsisi aliprocess.run-menetelmässä suoritetun komennon virhettä.
Esimerkki 1: Tekstitiedoston tulostussisältö Subprocess.run -menetelmällä
Alla oleva komento lähettää data.txt -tiedoston sisällön olettaen, että se sisältää nimen = John -merkkijonon.
tuonti aliprosessi
aliprosessi.juosta(['kissa', 'data.txt'])
Yllä olevan koodin suorittaminen palauttaa seuraavan tuloksen:
nimi=John
ValmisProsessi(args=['kissa', 'data.txt'],paluukoodi=0)
Listaargumentin ensimmäinen elementti on suoritettavan komennon nimi. Kaikki ensimmäisen elementin jälkeiset luettelon elementit katsotaan komentorivivalinnoiksi tai -kytkimiksi. Voit käyttää vaihtoehtoja myös yhdellä ja kahdella viivalla. Jos haluat esimerkiksi luetteloida hakemiston tiedostot ja kansiot, koodi olisi aliprosessi.run ([ls, -l]. Useimmissa tapauksissa voit pitää mitä tahansa välilyönnillä erotettua argumenttia shell -komennossa yksittäisenä elementtinä aliprocess.run -menetelmälle toimitettu luettelo.
Esimerkki 2: Aliprosessin suoritusmenetelmän tuloksen estäminen
Subprocess.run -menetelmän tukahduttamiseksi sinun on annettava lisäargumenteina stdout = subprocess.DEVNULL ja stderr = subprocess.DEVNULL.
tuonti aliprosessialiprosessi.juosta(['kissa', 'data.txt'],stdout=aliprosessi.DEVNULL,
stderr=aliprosessi.DEVNULL)
Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:
CompletedProcess (args = ['kissa', 'data.txt'], returncode = 0)
Esimerkki 3: Subprocess.run -menetelmän talteenoton tulostus
Jos haluat kaapata aliprosessi.run -menetelmän tuloksen, käytä lisäargumenttia, jonka nimi on capture_output = True.
tuonti aliprosessilähtö= aliprosessi.juosta(['kissa', 'data.txt'],capture_output=Totta)
Tulosta (lähtö)
Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:
ValmisProsessi(args=['kissa', 'data.txt'],paluukoodi=0,stdout=b'nimi = John n'',stderr=b'')
Voit käyttää stdout- ja stderr -arvoja erikseen käyttämällä output.stdout- ja output.stderr -menetelmiä. Lähtö tuotetaan tavusekvenssinä. Jos haluat saada merkkijonon, käytä output.stdout.decode (utf-8) -menetelmää. Voit myös antaa tekstin = tosi lisäargumenttina aliprosessi.run -kutsulle saadaksesi tuloksen merkkijonomuodossa. Voit saada poistumistilakoodin käyttämällä output.returncode -menetelmää.
Esimerkki 4: Nosta poikkeusta komennon epäonnistumisesta, joka suoritetaan aliprosessin suoritusmenetelmällä
Jos haluat nostaa poikkeuksen, kun komento poistuu tilasta, joka ei ole nolla, käytä check = True-argumenttia.
tuonti aliprosessialiprosessi.juosta(['kissa', 'data.tx'],capture_output=Totta,teksti=Totta,tarkistaa=Totta)
Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:
kohottaa CalledProcessError (retcode, process.args,aliprosessi.ConedProcessError: Komento '[' kissa ',' data.tx ']'
palautettu nollasta poikkeava poistumistila 1.
Esimerkki 5: Välitä merkkijono komennolle, joka suoritetaan aliprosessin suoritusmenetelmällä
Voit välittää merkkijonon komennolle, joka suoritetaan subprocess.run -menetelmällä, käyttämällä argumenttia input = ’string’.
tuonti aliprosessilähtö= aliprosessi.juosta(['kissa'], tulo='data.txt',capture_output=Totta,
teksti=Totta,tarkistaa=Totta)
Tulosta (lähtö)
Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:
CompletedProcess (args = ['kissa'], returncode = 0, stdout = 'data.txt', stderr = '')Kuten näette, yllä oleva koodi välittää data.txt -tiedoston merkkijonona eikä tiedosto -objektina. Jos haluat välittää data.txt -tiedoston tiedostona, käytä stdin -argumenttia.
kanssa avata('data.txt') kutenf:lähtö= aliprosessi.juosta(['kissa'],stdin=f,capture_output=Totta,
teksti=Totta,tarkistaa=Totta)
Tulosta (lähtö)
Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:
CompletedProcess (args = ['kissa'], returncode = 0, stdout = 'name = John n', stderr = '')Esimerkki 6: Suorita komento suoraan Shellissä käyttämällä Subprocess.run -menetelmää
On mahdollista suorittaa komento suoraan kuoreen sellaisenaan sen sijaan, että käytetään merkkijonojakoa pääkomennossa ja sitä seuraavissa asetuksissa. Tätä varten sinun on annettava shell = True lisäargumenttina. Python -kehittäjät eivät kuitenkaan suostu tähän, koska shell = True -käyttö voi johtaa turvallisuusongelmiin. Voit lukea lisää turvallisuusvaikutuksista osoitteesta tässä .
tuonti aliprosessialiprosessi.juosta('kissa' data.txt '',kuori=Totta)
Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:
nimi = JohnJohtopäätös
Subprocess.run -menetelmä Pythonissa on melko voimakas, koska sen avulla voit suorittaa shell -komentoja itse pythonissa. Tämä auttaa rajoittamaan kaiken koodin itse pythoniin ilman, että erillisiä tiedostoja tarvitsee lisätä komentotulkikoodia. Kuitenkin voi olla melko hankalaa merkitä kuorokomennot oikein python -luettelossa. Voit käyttää shlex.split () -menetelmää yksinkertaisten kuorikomentojen merkitsemiseen, mutta pitkissä, monimutkaisissa komennoissa - erityisesti niissä, joissa on symboli - shlex ei pysty jakamaan komentoa oikein. Tällaisissa tapauksissa virheenkorjaus voi olla hankala ongelma. Voit välttää tämän käyttämällä shell = True -argumenttia, mutta tähän toimintoon liittyy tiettyjä turvallisuusongelmia.