hvorfor dette enkle python-skriptet ikke skriver ut den virkelige redhat-versjonen?
version = os.system( " cat /etc/redhat-release | awk \"{print $7}\" " ) print ("my version is " ,version)
når jeg kjører den
fikk vi:
7.2 ("my version is ", 0)
- hvorfor vi får 0 i stedet 7.2?
- hvordan unngår man å få versjon – 7.2 fra os.system?
Kommentarer
- Python2 eller Python3?
- Skal dette flyttes til SO?
Svar
os.system()
bare kjører prosessen , den fanger ikke utdataene:
Hvis kommandoen genererer noen utdata, vil den sendes til tolkens standard utgangsstrøm.
Returverdien er utgangskoden for prosessen:
På Unix er returverdien utgangsstatus for prosessen som er kodet i formatet som er spesifisert for ventetid ().
Du må bruke noe sånt som
subprocess.check_output()
ellersubprocess.Popen()
direkte for å fange utdataene.>>> arch = subprocess.check_output("uname -a | awk "{print $9}"", shell=True); >>> arch "x86_64\n"
Kommentarer
- ok, men hvordan fanger du bare x86_64 uten " \ n "?
- @janga for eksemplet ovenfor , bruk arch [: – 1]?
- ok, fungerer, et annet siste spørsmål, hvordan man kan unngå utskrift fra os.system, for eksempel os.system (' sed -is " /7.0/$new_version/g" / tmp / file), den skriver ut strengen vi vil erstatte
- For å strippe den nye linjen, bruk
.rstrip()
- kan du vise meg snill all syntaksen?
Svar
Du kan bruke subprocess
-modulen og oppnå dette ganske enkelt.
#!/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())
Også for awk
del, kan du bruke sed "s/[^0-9_.-]//g /etc/redhat-release
. Dette trekker bare ut versjonsnummeret og trenger ikke å vite hvilket feltversjonsnummer som er som gjør det mer plattformuavhengig.
Kommentarer
- er denne variabelen – versjon – er uten " \ n ", fordi jeg vil bruke denne variabelen senere i sed-kommandoen inne i pythonet
- Jeg får ikke ' spørsmålet ditt. Uansett hva du gjør gjør ' t ser ut til å være fornuftig.