miksi tämä yksinkertainen python-komentosarja ei tulosta todellista redhat-versiota?
version = os.system( " cat /etc/redhat-release | awk \"{print $7}\" " ) print ("my version is " ,version)
kun suoritan sen
saimme:
7.2 ("my version is ", 0)
- miksi saamme 0 sen sijaan 7,2?
- miten vältetään version 7.2 saaminen os.systemistä?
Kommentit
- Python2 tai Python3?
- Pitäisikö tämä siirtää SO: han?
Vastaa
os.system()
vain suorittaa prosessin , se ei sieppaa tulosta:
Jos komento tuottaa jonkin lähdön, se lähetetään tulkin vakiolähtövirtaan.
Paluuarvo on prosessin poistumiskoodi:
Unixissa palautusarvo on prosessin poistumistila, joka on koodattu odotukseen määritetyssä muodossa ().
Sinun on käytettävä jotain esimerkiksi
subprocess.check_output()
taisubprocess.Popen()
suoraan tuloksen sieppaamiseksi.>>> arch = subprocess.check_output("uname -a | awk "{print $9}"", shell=True); >>> arch "x86_64\n"
Kommentit
- ok, mutta kuinka kaapata vain x86_64 ilman " \ n "?
- @janga edelliseen esimerkkiin , käytä arch [: – 1]?
- ok, toimii, toinen viimeinen kysymys, miten vältetään tulostaminen os.system-järjestelmästä, esimerkiksi os.system (' sed -is " /7.0/$new_version/g" / tmp / file), tulostaa merkkijonon, jonka haluamme korvata
- Voit poistaa uuden rivin käyttämällä
.rstrip()
- voitko näyttää minulle kaiken syntaksin?
vastaus
Voit käyttää subprocess
-moduulia ja saavuttaa tämän melko helposti.
#!/usr/bin/python3 import subprocess getVersion = subprocess.Popen("awk "{print $7}" /etc/redhat-release", shell=True, stdout=subprocess.PIPE).stdout version = getVersion.read() print("My version is", version.decode())
Myös awk
-osaa, voit käyttää sed "s/[^0-9_.-]//g /etc/redhat-release
. Tämä vain purkaa versionumeron, eikä sen tarvitse tietää, mikä kenttäväylän versionumero on, mikä tekee siitä alustasta riippumattoman.
Kommentit
- on tämä muuttuja – versio – on ilman " \ n ", koska haluan käyttää tätä muuttujaa myöhemmin sed -komennossa pythonissa
- En saa ' kyselyäsi. Mitä ikinä teetkin, ei näytä järkevältä.