Shell -komentojen suorittaminen Pythonissa aliprosessin suoritusmenetelmällä

How Execute Shell Commands Python Using Subprocess Run Method



Aliprosessi on sisäänrakennettu Python-moduuli, jonka avulla voidaan luoda uusia prosesseja ja olla vuorovaikutuksessa niiden tulo- ja lähtötietovirtojen kanssa. Yksinkertaisemmin sanottuna voit käyttää sitä kuorikomentojen suorittamiseen ja suoritettavien binääritiedostojen suorittamiseen, jotka ovat yleensä hajallaan eri roskakorikansioihin Linux -tiedostojärjestelmässä. Voit myös antaa täyden polun suoritettavalle binaarille ja käyttää mitä tahansa binääriin liittyviä komentorivikytkimiä. Tässä artikkelissa selitetään aliprosessimoduulin ja sen suoritusmenetelmän käyttäminen Python -sovelluksissa. Kaikki artikkelin koodinäytteet testataan Python 3.8.2: lla Ubuntu 20.04: ssä.

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 aliprosessi

aliprosessi.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 aliprosessi
lä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 aliprosessi
aliprosessi.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 aliprosessi
lä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 aliprosessi
aliprosessi.juosta('kissa' data.txt '',kuori=Totta)

Yllä olevan koodin suorittaminen tuottaa seuraavan tuloksen:

nimi = John

Johtopää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.