hvorfor dette enkle python-script ikke udskriver den rigtige redhat-version?
version = os.system( " cat /etc/redhat-release | awk \"{print $7}\" " ) print ("my version is " ,version)
når jeg kører det
fik vi:
7.2 ("my version is ", 0)
- hvorfor vi får 0 i stedet for 7.2?
- hvordan undgår man at få version – 7.2 fra os.system?
Kommentarer
- Python2 eller Python3?
- Skal dette flyttes til SO?
Svar
os.system()
kører bare processen , det fanger ikke output:
Hvis kommandoen genererer et output, sendes det til tolkens standardoutputstrøm.
Returværdien er procesens udgangskode:
På Unix er returværdien afslutningsstatus for processen kodet i det format, der er angivet til ventetid ().
Du skal bruge noget som
subprocess.check_output()
ellersubprocess.Popen()
direkte for at opfange output.>>> arch = subprocess.check_output("uname -a | awk "{print $9}"", shell=True); >>> arch "x86_64\n"
Kommentarer
- ok, men hvordan man kun fanger x86_64 uden " \ n "?
- @janga til ovenstående eksempel , brug arch [: – 1]?
- ok, virker, et andet sidste spørgsmål, hvordan man undgår udskrivning fra os.system, for eksempel os.system (' sed -is " /7.0/$new_version/g" / tmp / file), det udskriver den streng, som vi vil erstatte
- For at strippe den nye linje skal du bruge
.rstrip()
- kan du vise mig venligst al syntaksen?
Svar
Du kan bruge subprocess
-modul og opnå dette ret nemt.
#!/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å til awk
del, du kan bruge sed "s/[^0-9_.-]//g /etc/redhat-release
. Dette udtager kun versionsnummeret og behøver ikke at vide, hvilket feltversionsnummer der er, hvilket gør det mere platformuafhængigt.
Kommentarer
- er denne variabel – version – er uden " \ n ", fordi jeg vil bruge denne variabel senere i sed-kommandoen inde i pythonen
- Jeg får ikke ' ikke dit spørgsmål. Uanset hvad du laver, ser ' ikke ud til at give mening.