Ulkopuolisen komennon kutsu Pythonissa

freshWoWer 08/19/2017. 30 answers, 2.045.096 views
python shell command subprocess external

Kuinka kutsun ulkoisen komennon (ikään kuin kirjoitin sen Unix-kuoriin tai Windowsin komentokehotteeseen) Python-komentosarjasta?

2 Comments
Triton Man 03/19/2015
hei täällä on hyvä opetusohjelma, jossa integroidaan python kuoriin: dreamsyssoft.com/python-scripting-tutorial/shell-tutorial.ph p
6 J.F. Sebastian 06/12/2015
@TritonMan: se ei ole hyvä opetusohjelma. Käytä for line in proc.stdout: (tai for line in iter(proc.stdout.readline, '') Python 2: ssa) (instead of ( for line in proc.stdout.readlines(): ) for line in proc.stdout.readlines(): sijaan for line in proc.stdout.readlines(): Katso Python: lue suoratoistolähde subprocess.communicate ()

30 Answers


David Cournapeau 02/14/2017.

Katso standardikirjaston aliprosessimoduuli :

from subprocess import call
call(["ls", "-l"]) 

subprocess vs system etu on, että se on joustavampi (voit saada stdoutin, stderr: n, "todellisen" tilakoodin, paremman virheenkäsittelyn jne.).

Viralliset asiakirjat suosittelevat subprocess vaihtoehtoisen os.systemin () kautta:

subprocess tarjoaa tehokkaampia välineitä uusien prosessien kutsu- miseksi ja tulosten hakemiseksi; käyttämällä tätä moduulia on parempi käyttää tätä toimintoa [ os.system() ].

Osaprosessidokumentaation " Vanhojen toimintojen korvaaminen alihankintamoduulin " kanssa saattaa olla hyödyllisiä reseptejä.

subprocess viralliset asiakirjat:

5 comments
155 nosklo 05/26/2009
Etkö ymmärrä, miksi os.system-järjestelmää käytetään myös nopean / likainen / kertaluonteisena. aliprosessi vaikuttaa niin paljon paremmalta.
33 Liam 07/29/2010
Olen täysin samaa mieltä siitä, että osaprosessi on parempi. Minun piti vain kirjoittaa tämänkaltainen pikakomppailu toimimaan vanhalla palvelimella Python 2.3.4: lla, jolla ei ole aliprosessimoduulia.
50 daonb 03/21/2012
tässä ovat aliprosessidokumentit
6 goldenmean 11/10/2013
soita (..) Antoi virheen oython 2.7.6: Traceback (Viimeisin puhelun viimeinen): Tiedosto "E: \ Ajit \ MyPython \ synonyms1.py", rivin 27, <moduuli> puhelu ("dir") <br/> Tiedosto "C: \ Python27 \ lib \ subprocess.py", rivin 524, puhelun palautuksessa Popen (* popenargs, ** kwargs) .wait () <br/> Tiedosto "C: \ Python27 \ lib \ subprocess.py ", rivin 711, init errread, errwrite) <br/> Tiedosto" C: \ Python27 \ lib \ subprocess.py ", rivin 948, _execute_child käynnistysinfo) <br/> WindowsError: [Virhe 2] järjestelmä ei löydä määritettyä tiedostoa
61 J.F. Sebastian 12/21/2013
@goldenmean: ls.exe , Windowsissa ei ole ls.exe . Kokeile call("dir", shell=True)

Eli Courtwright 04/11/2016.

Seuraavassa on yhteenveto tavoista kutsua ulkoisia ohjelmia ja kunkin edut ja haitat:

  1. os.system("some_command with args") välittää komennon ja argumentit järjestelmän kuoriin. Tämä on mukavaa, koska voit itse suorittaa useita komentoja tällä kerralla tällä tavalla ja asettaa putket ja syöttää / tulostaa uudelleenohjauksen. Esimerkiksi:

    os.system("some_command < input_file | another_command > output_file") 

    Kuitenkin, kun tämä on kätevää, sinun on käsin käsiteltävä kuoriherkkien, kuten tilojen jne., Poistumista. Sen sijaan tämän avulla voit myös suorittaa komentoja, jotka ovat yksinkertaisesti komentojontoja, eivät varsinaisesti ulkoisia ohjelmia. Katso ohjeet .

  2. stream = os.popen("some_command with args") tekee samanlaisen kuin os.system paitsi että se antaa tiedostomuotoisen objektin, jota voit käyttää tavallisen syötteen / tulostimen käyttämiseen kyseiselle prosessille. Paneella on kolme muuta varianttia, jotka kaikki käsittelevät I / O: n hieman eri tavalla. Jos siirrät kaiken merkkijonaksi, komento siirretään kuoriin; jos siirrät ne luetteloksi, sinun ei tarvitse huolehtia siitä, että hän pakenee. Katso ohjeet .

  3. subprocess Popen luokka. Tämä on tarkoitettu korvaamaan os.popen mutta sen haittapuolena on olla monimutkaisempi sen vuoksi, että se on niin kattava. Voit esimerkiksi sanoa:

    print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read() 

    sijasta:

    print os.popen("echo Hello World").read() 

    mutta on mukavaa saada kaikki vaihtoehdot yhdellä yhtenäisellä luokalla neljän erilaisen popen-toiminnon sijasta. Katso ohjeet .

  4. call subprocess . Tämä on pohjimmiltaan aivan Popen luokkaa ja vie kaikki samat argumentit, mutta se vain odottaa kunnes komento on valmis ja antaa sinulle paluukoodin. Esimerkiksi:

    return_code = subprocess.call("echo Hello World", shell=True) 

    Katso ohjeet .

  5. Jos käytät Python 3.5 tai uudempaa, voit käyttää uutta subprocess.run -toimintoa, joka on paljon kuin edellä, mutta vielä joustavampi ja palauttaa CompletedProcess objektin, kun komento loppuu.

  6. Os moduulissa on myös kaikki haarukan / exec / spawn -funktiot, jotka sinulla olisi C-ohjelmassa, mutta en suosittele niiden käyttämistä suoraan.

subprocess pitäisi olla luultavasti mitä käytät.

Lopuksi on huomioitava, että kaikki menetelmät, joissa siirrät viimeisen komennon, jonka shell suorittaa merkkijonona ja olet vastuussa siitä, että se poistuu. There are serious security implications jos jollakin osaan merkkijonosta, jota siirryt, ei voida täysin luottaa. Esimerkiksi, jos käyttäjä kirjoittaa jonkin osan tai minkä tahansa osan merkkijonosta. Jos olet epävarma, käytä näitä menetelmiä vain vakioihin. Jotta voit antaa vihjeen seurauksista, katsokaa tätä koodia:

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read() 

ja kuvitella, että käyttäjä siirtyy "äitini ei rakastanut minua && rm-rf /".

5 comments
8 Casebash 05/16/2010
Et maininnut komentomoduulia
111 Eli Courtwright 05/16/2010
@Casebash: En ollut huolissani mainita sitä, koska dokumentaatiossa todetaan, että The subprocess module provides more powerful facilities for spawning new processes and retrieving their results. Using the subprocess module is preferable to using the commands module. kutsu- miseksi The subprocess module provides more powerful facilities for spawning new processes and retrieving their results. Using the subprocess module is preferable to using the commands module. The subprocess module provides more powerful facilities for spawning new processes and retrieving their results. Using the subprocess module is preferable to using the commands module. Vastaavasti emme maininnut popen2- moduulia, koska se on myös vanhentunut, ja sekä commands että commands moduuli ovat todellisuudessa menneet Python 3.0: ssä ja uudemmissa. Vastaukseni muokkaamisen sijaan anna näiden kommenttien olla tapa, jolla nämä moduulit mainitaan.
15 PhoebeB 11/15/2010
Hyvä artikkeli aliprosessin käytöstä täällä: doughellmann.com/PyMOTW/subprocess
11 jldupont 01/21/2012
komentomoduuli on vanhentunut nyt.
13 simao 06/12/2012
Monissa tapauksissa sinun ei tarvitse kirjoittaa Popen-objektiin suoraan, voit käyttää subprocess.check_call ja subprocess.check_output

EmmEff 12/10/2016.

Käytän tyypillisesti:

import subprocess

p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait() 

Voit vapaasti tehdä mitä haluat putkiston stdout tietojen avulla. Itse asiassa voit yksinkertaisesti jättää nämä parametrit ( stdout= ja stderr= ) ja käyttäytyä kuten os.system() .

5 comments
19 J.F. Sebastian 11/16/2012
.readlines() lukee all rivit kerralla eli se .readlines() kunnes aliprosessi poistuu (sulkee putken päätä). Jos haluat lukea reaaliaikaisesti (jos ei ole puskurointikysymyksiä), voit: for line in iter(p.stdout.readline, ''): print line,
EmmEff 11/17/2012
Voisitteko selvittää, mitä tarkoitat "jos ei ole puskurointikysymyksiä"? Jos prosessi lakkaa ehdottomasti, myös alihakupuhelu estää. Sama voi tapahtua myös alkuperäisen esimerkin kanssa. Mitä muuta puskuroinnilla voisi tapahtua?
9 J.F. Sebastian 11/17/2012
lapsiprosessi voi käyttää p.stdout.readline() ei-interaktiivisessa tilassa p.stdout.readline() sijasta, joten p.stdout.readline() (huomaa: ei s : tä lopussa) ei näe mitään tietoja, ennen kuin lapsi täyttää sen puskurin. Jos lapsi ei tuota paljon tietoja, lähtö ei ole reaaliajassa. Katso toinen syy Q: Miksi ei vain käytä putkea (popen ())? . Tässä vastauksessa on joitain kiertotavoja (pexpect, pty, stdbuf)
2 J.F. Sebastian 04/10/2013
@Paul: Jos koodisi tuottaa odottamattomia tuloksia, voit luoda täydellisen minimaalisen koodin esimerkin, joka toistaa ongelman ja lähettää sen uutena kysymyksenä . Mainitse, mitä odotat tapahtuvan ja mitä sen sijaan tapahtuu.
2 Paul 04/11/2013
Kaikki oikein otti neuvoja stackoverflow.com/questions/15945585/... kiitos!

newtover 07/27/2017.

Joitakin vihjeitä lapsiprosessin irrottamisesta kutsuvasta (lapsiprosessin aloittamisesta taustalla).

Oletetaan, että haluat aloittaa pitkän tehtävän CGI-komentosarjasta, eli lapsiprosessin pitäisi elää kauemmin kuin CGI-komentosarjan suoritusprosessi.

Alikäsittelyn moduulitiedostojen klassinen esimerkki on:

import subprocess
import sys

# some code here

pid = subprocess.Popen([sys.executable, "longtask.py"]) # call subprocess

# some more code here 

Ajatus tässä on se, että et halua odottaa rivillä "puheluosaprosessia", kunnes longtask.py on päättynyt. Mutta ei ole selvää, mitä tapahtuu linjan jälkeen "muutaman koodin täällä" esimerkistä.

Oma tavoitealusta oli ilmainen, mutta kehitys oli ikkunoissa, joten törmäsin ongelman ikkunaan ensin.

Windowsissa (win xp) emoprosessi päättyy, kunnes longtask.py on päättynyt. Se ei ole sitä mitä haluat CGI-komentosarjassa. Ongelma ei ole Pythonille ominaista, mutta PHP-yhteisössä ongelmat ovat samat.

Ratkaisu on siirtää DETACHED_PROCESS prosessin luomislippu perustana olevaan CreateProcess-funktioon win API: ssä. Jos sinulla on asennettu pywin32, voit tuoda lipun win32process-moduulista, muuten sinun pitäisi määritellä se itse:

DETACHED_PROCESS = 0x00000008

pid = subprocess.Popen([sys.executable, "longtask.py"],
                       creationflags=DETACHED_PROCESS).pid 

/ * UPD 2015.10.27 @eryksun huomautuksessa alla huomauttaa, että semanttisesti oikea lippu on CREATE_NEW_CONSOLE (0x00000010) * /

Vapaa-ajalla meillä on toinen ongelma: kun vanhemman prosessi on valmis, se viimeistelee myös lapsen prosessit. Ja tämä ei ole mitä haluat CGI-komentosarjassa. Jotkut kokeet osoittivat, että ongelma näytti olevan jakamalla sys.stdout. Työskentelyratkaisu oli seuraava:

pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 

En ole tarkistanut koodia muilla alustoilla eikä tiedä käyttäytymisen syitä. Jos joku tietää, jakaa ideasi. Googling Python-taustaprosessien käynnistämisessä ei tuota valoa vielä.

5 comments
maranas 04/09/2010
kiitos vastauksesta! Huomasin mahdollisen "huijauksen" kehittämällä py2exe apps vuonna pydev + eclipse. pystyin kertomaan, että pääkriptiota ei irrotettu, koska eclipse-lähdön ikkuna ei lopetettu; vaikka komentosarja toteutuisi loppuun, se odottaa edelleen tuottoa. mutta kun yritin koota py2exe-suoritettavaan, odotettu käyttäytyminen tapahtuu (suorittaa prosessit irti, sitten sulkeutuu). En ole varma, mutta suoritettava nimi ei ole enää prosessiluettelossa. tämä toimii kaikissa lähestymistavoissa (os.system ("start *"), os.spawnl os.P_DETACH, subprocs jne.)
Alexey Lebedev 04/16/2012
Windows gotcha: vaikka olen kehittänyt prosessin DETACHED_PROCESSin kanssa, kun tapasin Python -demooni, kaikki avaamat portit eivät vapaudu, ennen kuin kaikki kutomatut prosessit päättyvät. WScript.Shell ratkaisi kaikki ongelmani. Esimerkki tästä: pastebin.com/xGmuvwSx
1 J.F. Sebastian 11/16/2012
saatat tarvita myös CREATE_NEW_PROCESS_GROUP-lippua. Katso Popen odottaa lapsiprosessia, vaikka välittömästi lapsi on lopetettu
1 eryksun 10/27/2015
Seuraava on virheellinen: "[n] n ikkunat (win xp), emoprosessi ei lopu ennen kuin longtask.py on päättynyt". Vanhempi poistuu normaalisti, mutta konsoli-ikkuna (conhost.exe -esimerkki) sulkeutuu vain, kun viimeinen liitetty prosessi poistuu ja lapsi voi mahdollisesti periä vanhemman konsolin. DETACHED_PROCESS asetusten määrittäminen creationflags välttää tämän estämällä lapsen perimästä tai luomasta konsolin. Jos haluat uuden konsolin sijaan, käytä CREATE_NEW_CONSOLE (0x00000010).
1 eryksun 10/27/2015
En tarkoittanut, että toteuttaminen irrallisena prosessina on virheellinen. Tällöin saatat joutua asettamaan vakiokäsittelyt tiedostoihin, putkiin tai os.devnull koska jotkut konsoliohjelmat poistuvat muulla tavoin. Luo uusi konsoli, kun haluat lapsiprosessin olla vuorovaikutuksessa käyttäjän kanssa samanaikaisesti vanhemman prosessin kanssa. Olisi hämmentävä yrittää tehdä molemmat yhdessä ikkunassa.

sirwart 04/04/2014.

Suosittelen käyttää osoprosessimoduulia os.systemin sijasta, koska se kuorii paeta sinulle ja on sen vuoksi paljon turvallisempaa: http://docs.python.org/library/subprocess.html

subprocess.call(['ping', 'localhost']) 
2 comments
Joe Skora 09/18/2008
Ja osaprosessin avulla voit liittää helposti prosessin tulo- / lähtövirtoihin jne.
6 habnabit 09/18/2008
aliprosessi ei tee kuori pakenemaan sinua, koska se välttää kuoren käytön kokonaan. Se tarkoittaa tosiasiassa, että käynnistys on hieman nopeampaa ja siellä on vähemmän yleiskustannuksia.

Alexandra Franks 01/26/2016.
import os
cmd = 'ls -al'
os.system(cmd) 

Jos haluat palauttaa komennon tulokset, voit käyttää os.popen . Tämä on kuitenkin vanhentunut, koska versio 2.6 on aliprosessimoduulin eduksi, ja muut vastaukset ovat hyvin katettuja.

3 comments
2 Fox Wilson 08/08/2014
popen hylätään subprocessin hyväksi.
BuvinJ 04/12/2017
Lisää cmd = subprocess.list2cmdline( [ 'my','list','of','tokens' ] ) käsittelemiseksi.
Karlos 04/15/2017
Täsmällinen kunnioitus paikallisen OS: n kartoittamisessa, kun sitä käytetään useissa ympäristöjärjestelmissä

nimish 09/18/2008.
import os
os.system("your command") 

Huomaa, että tämä on vaarallista, koska komentoa ei puhdisteta. Jätän teidät google: lle os- ja sys-moduuleista. On joukko toimintoja (exec *, spawn *), jotka tekevät samanlaisia ​​asioita.


athanassis 05/28/2017.

Tarkista myös "pexpect" Python-kirjasto.

Se mahdollistaa ulkoisten ohjelmien / komentojen vuorovaikutteisen hallinnan, jopa ssh, ftp, telnet jne. Voit kirjoittaa vain jotain:

child = pexpect.spawn('ftp 192.168.0.24')

child.expect('(?i)name .*: ')

child.sendline('anonymous')

child.expect('(?i)password') 

Jorge E. Cardona 07/23/2013.

Käytän aina fabric seuraavia asioita varten:

from fabric.operations import local
result = local('ls', capture=True)
print "Content:/n%s" % (result, ) 

Mutta tämä näyttää olevan hyvä työkalu: sh (Python-aliprosessointirajapinta) .

Katso esimerkki:

from sh import vgdisplay
print vgdisplay()
print vgdisplay('-v')
print vgdisplay(v=True) 
1 comments
2 Yauhen Yakimovich 05/23/2013
sh on parempi kuin aliprosessimoduuli. Se mahdollistaa paremman kuoren integroinnin

Facundo Casco 12/10/2016.

Jos tarvitset sen komennon tuoton, jota soitat,
voit käyttää subprocess.check_output (Python 2.7+).

>>> subprocess.check_output(["ls", "-l", "/dev/null"])
'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n' 

Huomaa myös kuoriparametri .

Jos shell on True , määritetty komento suoritetaan shellin kautta. Tämä voi olla hyödyllistä, jos käytät Python ensisijaisesti parannetulla ohjausvirralla, jota se tarjoaa useimpien järjestelmäkuvakkeiden kohdalla ja silti haluavat helpon pääsyn muihin kuoriominaisuuksiin kuten kuoriputkistoihin, tiedostonimiin, muuttuviin muuttujiin ja laajentamiseen ~ käyttäjän kotiin hakemistoon. Huomaa kuitenkin, että Python itse tarjoaa monien fnmatch ominaisuuksien (erityisesti glob , fnmatch , os.walk() , os.path.expandvars() , os.path.expanduser() ja shutil ) shutil .


Usman Khan 10/28/2012.

Näin ajetaan komentojani. Tällä koodilla on kaikki mitä tarvitset melko paljon

from subprocess import Popen, PIPE
cmd = "ls -l ~/"
p = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
print "Return code: ", p.returncode
print out.rstrip(), err.rstrip() 
3 comments
Eric 07/23/2013
Komentosarjojen siirtäminen merkkijonoksi on yleensä huono ajatus
1 Adam Matan 04/02/2014
Mielestäni se on hyväksyttävää koville koodeille, jos se lisää luettavuutta.
sam 09/12/2016
Kiitos. Perlistä ja Rubystä tulevat Python on PITA, kun kyse on käskyjen suorittamisesta. Lue paljon ratkaisuja. Kuten sinun kanssasi.

Honza Javorek 08/12/2016.

Vakiokirjasto

Käytä aliprosessimoduulia :

from subprocess import call
call(['ls', '-l']) 

Se on suositeltava tavallinen tapa. Monimutkaisempia tehtäviä (putket, tuotos, syöttö jne.) Voi kuitenkin olla tylsiä rakentaa ja kirjoittaa.

Huomaa: shlex.split auttaa sinua jäsentämään komentoa call ja muille alikäsittelytoiminnoille , jos et halua (tai et voi!) Antaa ne listojen muodossa:

import shlex
from subprocess import call
call(shlex.split('ls -l')) 

Ulkoiset riippuvuudet

Jos et ole huolissasi ulkoisista riippuvuuksista, käytä plumbumia :

from plumbum.cmd import ifconfig
print(ifconfig['wlan0']()) 

Se on paras subprocess . Se on monialainen, eli se toimii sekä Windows- että Unix-kaltaisissa järjestelmissä. Asenna pip install plumbum .

Toinen suosittu kirjasto on sh :

from sh import ifconfig
print(ifconfig('wlan0')) 

Kuitenkin sh pudonnut Windows-tuki, joten se ei ole yhtä mahtava kuin se ennen. Asenna pip install sh .


Joe 05/23/2017.

Päivittää:

subprocess.run on suositeltu lähestymistapa Python 3.5: ssä, jos koodisi ei tarvitse ylläpitää yhteensopivuutta aikaisempien Python-versioiden kanssa. Se on johdonmukaisempaa ja tarjoaa samanlaista helppokäyttöisyyttä kuin lähettiläs. (Putkisto ei ole yhtä helppoa. Katso tämä kysymys siitä, miten .)

Tässä on muutamia esimerkkejä asiakirjoista .

Suorita prosessi:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0) 

Nousu epäonnistui:

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 

Tallennuksen teho:

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n') 

Alkuperäinen vastaus:

Suosittelen, että yrität lähetä . Se on aliprosessin kääre, joka puolestaan pyrkii korvaamaan vanhat moduulit ja toiminnot. Lähettiläs on ihmisen aliprosessi.

Esimerkki käyttöohjeesta readme :

>>> r = envoy.run('git config', data='data to pipe in', timeout=2)

>>> r.status_code
129
>>> r.std_out
'usage: git config [options]'
>>> r.std_err
'' 

Piipata tavaraa myös:

>>> r = envoy.run('uptime | pbcopy')

>>> r.command
'pbcopy'
>>> r.status_code
0

>>> r.history
[] 
2 comments
4 J.F. Sebastian 10/03/2015
Huomaa: subprocess.run() joka ohittaa oletusarvoisesti nollatulon poistuvan tilan, on regressio verrattuna subprocess.check_call() tai subprocess.check_output() . python -mthis : " python -mthis ei pitäisi koskaan kulkea hiljaa, ellei nimenomaan python -mthis ."
itirazimvar 09/01/2016
Kiitos mies lähettiläs työskentelee paremmin kuin osa prosessi, sinä pelasti päiväni. Komento, joka on komento = "ansible-playbook playbook.yaml --extra-vars = \" esxi_host = {0} extravar1 = {1} extravar2 = {2} extravar3 = {3} \ "" muoto (extravar1, extravar2 , extravar3) ja r.envoy.run (komento)

Tom Fuller 05/28/2017.

On olemassa paljon erilaisia ​​kirjastoja, joiden avulla voit soittaa ulkopuolisiin komentoihin Pythonin kanssa. Jokaisesta kirjastosta olen antanut kuvauksen ja näyttänyt esimerkin ulkoisen komennon kutsumisesta. Esimerkkinä käyttämä komento on ls -l (luettelota kaikki tiedostot). Jos haluat tietää lisää kaikista kirjastoista, jotka olen luetellut ja liittänyt kunkin oppaan asiakirjat.

Sources:

These are all the libraries:

Toivottavasti tämä auttaa sinua tekemään päätöksen siitä, mihin kirjastoon haluat käyttää :)

subprocess

Aliprosessin avulla voit soittaa ulkoisiin komentoihin ja liittää ne tulo- / lähtö / virheputkiin (stdin, stdout ja stderr). Subprocess on oletusvaihtoehto komentojen käytölle, mutta joskus muut moduulit ovat parempia.

subprocess.run(["ls", "-l"]) # Run command
subprocess.run(["ls", "-l"], stdout=subprocess.PIPE) # This will run the command and return any output
subprocess.run(shlex.split("ls -l")) # You can also use the shlex library to split the command 

os

os käytetään "käyttöjärjestelmän riippuvaisiin toimintoihin". Sitä voidaan käyttää myös ulkoisten komentojen kutsumiseen os.system ja os.popen (Huomautus: on myös os.popen ). os aina ajaa shell ja on yksinkertainen vaihtoehto ihmisille, jotka eivät tarvitse tai eivät osaa käyttää subprocess.run .

os.system("ls -l") # run command
os.popen("ls -l").read() # This will run the command and return any output 

sh

sh on aliprosessointirajapinta, jonka avulla voit soittaa ohjelmia ikään kuin ne toimisivat. Tämä on hyödyllistä, jos haluat suorittaa komennon useita kertoja.

sh.ls("-l") # Run command normally
ls_cmd = sh.Command("ls") # Save command as a variable
ls_cmd() # Run command as if it were a function 

plumbum

plumbum on kirjasto "script-like" Python-ohjelmia varten. Voit soittaa ohjelmia kuten toimintoja kuten sh . Plumbum on hyödyllinen, jos haluat käyttää putkea ilman kuorta.

ls_cmd = plumbum.local("ls -l") # get command
ls_cmd() # run command 

pexpect

pexpect avulla voit keksiä lapsi sovelluksia, hallita niitä ja löytää kuvioita niiden tuotosta. Tämä on parempi vaihtoehto aliprosessille komennoille, jotka odottavat tty: tä Unixilla.

pexpect.run("ls -l") # Run command as normal
child = pexpect.spawn('scp foo user@example.com:.') # Spawns child application
child.expect('Password:') # When this is the output
child.sendline('mypassword') 

fabric

kangas on Python 2.5 ja 2.7 kirjasto. Sen avulla voit suorittaa paikalliset ja etäiset komentotulkit. Kangas on yksinkertainen vaihtoehto käynnissä olevien komentojen suorittamiseksi suojatussa kuoressa (SSH)

fabric.operations.local('ls -l') # Run command as normal
fabric.operations.local('ls -l', capture = True) # Run command and receive output 

envoy

lähettiläs tunnetaan "ihmisen osaprosessiksi". Sitä käytetään subprocess moduulin ympärillä mukavuuskääreinä.

r = envoy.run("ls -l") # Run command
r.std_out # get output 

commands

commands sisältävät os.popen , mutta se on poistettu Python 3: sta, koska subprocess on parempi vaihtoehto.

Muokkaus perustui JF Sebastianin kommenttiin.

4 comments
Tom Fuller 10/29/2016
Kaipaanko mitään?
3 J.F. Sebastian 11/02/2016
Voisi olla hyödyllistä täsmentää, when ja why haluaisit yhden kirjaston toisten kesken, esim. pexpect on hyödyllinen komennoille, jotka odottavat tty: tä plumbum , plumbum voi käyttää putkilinjan käyttämättä plumbum kuoria , fabric on yksinkertainen tapa aja komentoja ssh: n kautta, subprocess (toisin kuin os ) ei koskaan suorita kuoria, ellet kysy - se on oletusarvoinen valinta ulkoisten komentojen suorittamiseen, joskus tarvitset vaihtoehtoja .
Tom Fuller 11/02/2016
Olen muokannut vastaukseni palautteen perusteella :)
1 J.F. Sebastian 11/02/2016
os "ulkoiset komennot" -toiminnot toteutetaan subprocess sisäisesti. Se voi olla hyödyllistä muiden kielten ihmisille ( system() , popen() on yhteinen sovellusliittymä), jotka eivät tarvitse täydentävää osa-prosessimoduulia ja joilla ei ole aikaa oppia käyttämään subprocess.run() ja muut aliprosessin toiminnot.

Zuckonit 05/28/2017.

Ilman tuotoksen tulosta:

import os
os.system("your command here") 

Tuloksen tuloksena:

import commands
commands.getoutput("your command here")
or
commands.getstatusoutput("your command here") 
1 comments
2 Ramsharan 10/19/2013
Pidän osasta, with output of result . Tarvitsin tämän käyttääksesi sublime-konsolissa.

stuckintheshuck 10/10/2014.

On myös Plumbum

>>> from plumbum import local
>>> ls = local["ls"]
>>> ls
LocalCommand()
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
>>> notepad = local["c:\\windows\\notepad.exe"]
>>> notepad()                                   # Notepad window pops up
u''                                             # Notepad window is closed by user, command returns 
1 comments
J.F. Sebastian 07/13/2015
tai lisätä hieman taikuutta: from plumbum.cmd import ls, grep; output = (ls | grep['pattern'])() from plumbum.cmd import ls, grep; output = (ls | grep['pattern'])()

Ben Hoffstein 11/02/2014.

https://docs.python.org/2/library/subprocess.html

... tai hyvin yksinkertainen komento:

import os
os.system('cat testfile') 

Martin W 12/10/2016.

os.system on kunnossa, mutta eräänlainen päivätty. Se ei myöskään ole kovin turvallinen. Sen sijaan kokeile subprocess . subprocess ei soita suoraan ja on siten turvallisempi kuin os.system .

Saat lisätietoja täältä .


William Keller 12/10/2016.

os.system on korvattu subprocess . Käytä sen sijaan osaprosenttia.

3 comments
14 Michael Mior 03/29/2010
Ehkä esimerkki osa-prosessin käyttämisestä?
5 Mark Amery 12/22/2016
Koska hyväksytty vastaus ehdotti subprocess aikaisemmin ja yksityiskohtaisemmin, en näe mitään arvoa, joka vastaa tähän vastaukseen.
sudo 04/23/2017
Mikä on os.system vika? Se on kaikkein intuitiivinen, vain suorittaa sen, mitä laitat merkkijonoon, eikä siinä ole kaikkia varoituksia, jotka ihmiset luettavat hyväksytyn vastauksen alla.

cdunn2001 01/18/2011.

subprocess.check_call on kätevä, jos et halua testata paluuarvoja. Se poikkeaa virheestä.


Atinc Delican 12/10/2016.

Tässä on toinen ero, jota ei ole mainittu edellä.

subprocess.Popen suorittaa aliprosessin. Minun tapauksessani minun on täytettävä tiedosto, joka tarvitsee kommunikoida toisen ohjelman kanssa.

Yritin aliprosessia, toteutus onnistui. Kuitenkin ei voinut kommentoida w /. kaikki normaali, kun ajetaan sekä terminaalista.

Yksi vielä: (HUOM: kwrite käyttäytyy eri sovelluksilta. Jos yrität alla, firefox-tulokset eivät ole samat)

Jos yrität os.system("kwrite") , ohjelmavirta jäätyy, kunnes käyttäjä sulkee kwrite-ohjelman. Voit voittaa, että yritin sijaan os.system(konsole -e kwrite) . Tällä kertaa ohjelma jatkoi virtausta, mutta kwriteistä tuli konsolin osaprosessi.

Jokainen suorittaa kwrite ei ole aliprosessia (eli järjestelmän näytössä se on näkyvä puun vasemmalla reunalla)


Priyankara 05/28/2017.

Käyttää:

import os

cmd = 'ls -al'

os.system(cmd) 

os - Tämä moduuli tarjoaa kannettavan tapin käyttää käyttöjärjestelmän riippuvaisia ​​toimintoja.

os toimintojen osalta tässä on dokumentaatio.

3 comments
PolarisUser 10/09/2015
Onko olemassa keino työntää cmd: n tulos tiedostoon? Käyristän verkkosivustoa ja haluan sen menevän tiedostoon.
user2820579 10/16/2015
Tämä on selvästi yksinkertaisin ja tehokkain ratkaisu. @PolarisUser -ohjelman avulla voit käyttää yleistä linux-komentoa: > outputfile.txt
Corey Goldberg 12/09/2015
se on myös vanhentunut. käyttää aliprosessia

Saurabh Bangad 06/11/2012.

os.system ei salli tallentaa tuloksia, joten jos haluat tallentaa tuloksia joillekin listalle tai jotain subprocess.call toimii.


Emil Stenström 04/30/2014.

Minulla on taipumus käyttää aliprosessia yhdessä shlexin kanssa (käsittelemään jumiutuneita merkkijonoja):

>>> import subprocess, shlex
>>> command = 'ls -l "/your/path/with spaces/"'
>>> call_params = shlex.split(command)
>>> print call_params
["ls", "-l", "/your/path/with spaces/"]
>>> subprocess.call(call_params) 

houqp 05/01/2014.

Häpeä pistoke, kirjoittelin kirjaston tähän: P https://github.com/houqp/shell.py

Se on periaatteessa kääre popen ja shlex nyt. Se tukee myös putkikomentoja, jotta Python voi ketjuttaa komentoja helpommin. Joten voit tehdä seuraavia asioita:

ex('echo hello shell.py') | "awk '{print $2}'" 

admire 05/28/2017.

Voit käyttää Popenia, ja voit tarkistaa menettelyn tilan:

from subprocess import Popen

proc = Popen(['ls', '-l'])
if proc.poll() is None:
    proc.kill() 

Tarkista osaprosessi .


IRSHAD 07/20/2016.

Noudata verkko-id avautumattomasta neutronista:

#!/usr/bin/python
import os
netid= "nova net-list | awk '/ External / { print $2 }'"
temp=os.popen(netid).read()  /* here temp also contains new line (\n) */
networkId=temp.rstrip()
print(networkId) 

nova net-list tuotos

+--------------------------------------+------------+------+
| ID                                   | Label      | CIDR |
+--------------------------------------+------------+------+
| 431c9014-5b5d-4b51-a357-66020ffbb123 | test1      | None |
| 27a74fcd-37c0-4789-9414-9531b7e3f126 | External   | None |
| 5a2712e9-70dc-4b0e-9281-17e02f4684c9 | management | None |
| 7aa697f5-0e60-4c15-b4cc-9cb659698512 | Internal   | None |
+--------------------------------------+------------+------+ 

print(networkId)

27a74fcd-37c0-4789-9414-9531b7e3f126 

yuval 11/27/2016.

Linuxissa, jos haluat kutsua ulkoisen komennon, joka suoritetaan itsenäisesti (jatkuu sen jälkeen, kun python-komentosarja päättyy), voit käyttää yksinkertaista jonoa tehtäväpääkäyttäjänä tai komentokehotteessa

Esimerkki tehtävästääjälaitteella:

import os
os.system('ts ') 

Huomautukset tehtävästääjästä ( ts ):

  1. Voit määrittää samanaikaisten prosessien määrän ("lähtö") seuraavasti:

    ts -S

  2. ts asentaminen ei edellytä järjestelmänvalvojan oikeuksia. Voit ladata ja kääntää sen lähteestä yksinkertaisella make , lisätä sen polkuun ja olet valmis.


urosjarc 05/28/2017.

Tässä ovat kaksi senttiäni: mielestäni tämä on paras käytäntö, kun käsitellään ulkoisia komentoja ...

Nämä ovat palautusarvot toteutusmenetelmästä ...

pass, stdout, stderr = execute(["ls","-la"],"/home/user/desktop") 

Tämä on toteutusmenetelmä ...

def execute(cmdArray,workingDir):

    stdout = ''
    stderr = ''

    try:
        try:
            process = subprocess.Popen(cmdArray,cwd=workingDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1)
        except OSError:
            return [False, '', 'ERROR : command(' + ' '.join(cmdArray) + ') could not get executed!']

        for line in iter(process.stdout.readline, b''):

            try:
                echoLine = line.decode("utf-8")
            except:
                echoLine = str(line)

            stdout += echoLine

        for line in iter(process.stderr.readline, b''):

            try:
                echoLine = line.decode("utf-8")
            except:
                echoLine = str(line)

            stderr += echoLine

    except (KeyboardInterrupt,SystemExit) as err:
        return [False,'',str(err)]

    process.stdout.close()

    returnCode = process.wait()
    if returnCode != 0 or stderr != '':
        return [False, stdout, stderr]
    else:
        return [True, stdout, stderr] 
1 comments
ppperry 07/07/2016
.communicate : käytä .communicate menetelmää

Swadhikar C 05/28/2017.

Windowsissa voit tuoda vain subprocess ja suorittaa ulkoisia komentoja kutsumalla subprocess.Popen() , subprocess.Popen().communicate() ja subprocess.Popen().wait() seuraavasti:

# Python script to run a command line
import subprocess

def execute(cmd):
    """
        Purpose  : To execute a command and return exit status
        Argument : cmd - command to execute
        Return   : exit_code
    """
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (result, error) = process.communicate()

    rc = process.wait()

    if rc != 0:
        print "Error: failed to execute command:", cmd
        print error
    return result
# def

command = "tasklist | grep python"
print "This process detail: \n", execute(command) 

lähtö:

This process detail:
python.exe                     604 RDP-Tcp#0                  4      5,660 K 

HighResolutionMusic.com - Download Hi-Res Songs

1 The Chainsmokers

Beach House flac

The Chainsmokers. 2018. Writer: Andrew Taggart.
2 (G)I-DLE

POP/STARS flac

(G)I-DLE. 2018. Writer: Riot Music Team;Harloe.
3 Ariana Grande

​Thank U, Next flac

Ariana Grande. 2018. Writer: Crazy Mike;Scootie;Victoria Monét;Tayla Parx;TBHits;Ariana Grande.
4 Anne-Marie

Rewrite The Stars flac

Anne-Marie. 2018. Writer: Benj Pasek;Justin Paul.
5 Clean Bandit

Baby flac

Clean Bandit. 2018. Writer: Jack Patterson;Kamille;Jason Evigan;Matthew Knott;Marina;Luis Fonsi.
6 Nicki Minaj

No Candle No Light flac

Nicki Minaj. 2018. Writer: Denisia “Blu June” Andrews;Kathryn Ostenberg;Brittany "Chi" Coney;Brian Lee;TJ Routon;Tushar Apte;ZAYN;Nicki Minaj.
7 BlackPink

Kiss And Make Up flac

BlackPink. 2018. Writer: Soke;Kny Factory;Billboard;Chelcee Grimes;Teddy Park;Marc Vincent;Dua Lipa.
8 Imagine Dragons

Bad Liar flac

Imagine Dragons. 2018. Writer: Jorgen Odegard;Daniel Platzman;Ben McKee;Wayne Sermon;Aja Volkman;Dan Reynolds.
9 BTS

Waste It On Me flac

BTS. 2018. Writer: Steve Aoki;Jeff Halavacs;Ryan Ogren;Michael Gazzo;Nate Cyphert;Sean Foreman;RM.
10 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
11 Little Mix

Woman Like Me flac

Little Mix. 2018. Writer: Nicki Minaj;Steve Mac;Ed Sheeran;Jess Glynne.
12 Brooks

Limbo flac

Brooks. 2018.
13 Fitz And The Tantrums

HandClap flac

Fitz And The Tantrums. 2017. Writer: Fitz And The Tantrums;Eric Frederic;Sam Hollander.
14 Backstreet Boys

Chances flac

Backstreet Boys. 2018.
15 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
16 Diplo

Close To Me flac

Diplo. 2018. Writer: Ellie Goulding;Savan Kotecha;Peter Svensson;Ilya;Swae Lee;Diplo.
17 Rita Ora

Velvet Rope flac

Rita Ora. 2018.
18 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
19 Imagine Dragons

Machine flac

Imagine Dragons. 2018. Writer: Wayne Sermon;Daniel Platzman;Dan Reynolds;Ben McKee;Alex Da Kid.
20 Erika Sirola

Speechless flac

Erika Sirola. 2018. Writer: Teemu Brunila;Stefan Dabruck;Jürgen Dohr;Guido Kramer;Dennis Bierbrodt;Chris Braide;Robin Schulz.

Related questions

Hot questions

Language

Popular Tags