varför detta enkla python-skript inte skriver ut den verkliga redhat-versionen?
version = os.system( " cat /etc/redhat-release | awk \"{print $7}\" " ) print ("my version is " ,version)
när jag kör den
fick vi:
7.2 ("my version is ", 0)
- varför vi får 0 istället 7.2?
- hur man undviker att få version – 7.2 från os.system?
Kommentarer
- Python2 eller Python3?
- Bör detta flyttas till SO?
Svar
os.system()
kör bara processen , det fångar inte utdata:
Om kommandot genererar någon utdata kommer den att skickas till tolkens standardutmatningsström.
Returvärdet är processens utgångskod:
På Unix är returvärdet utgångsstatus för processen kodad i det format som anges för väntan ().
Du måste använda något som
subprocess.check_output()
ellersubprocess.Popen()
direkt för att fånga utdata.>>> arch = subprocess.check_output("uname -a | awk "{print $9}"", shell=True); >>> arch "x86_64\n"
Kommentarer
- ok, men hur man bara kan fånga x86_64 utan " \ n "?
- @janga för ovanstående exempel , använd arch [: – 1]?
- ok, fungerar, en annan sista fråga, hur man undviker utskrift från os.system, till exempel os.system (' sed -is " /7.0/$new_version/g" / tmp / file), dess utskrift av strängen som vi vill ersätta
- För att ta bort den nya raden, använd
.rstrip()
- kan du visa mig snälla all syntax?
Svar
Du kan använda subprocess
-modulen och uppnå detta ganska 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())
Även för awk
del kan du använda sed "s/[^0-9_.-]//g /etc/redhat-release
. Detta extraherar bara versionsnumret och behöver inte veta vilket fältversionnummer som gör det mer plattformsoberoende.
Kommentarer
- är denna variabel – version – är utan " \ n ", för jag vill använda den här variabeln senare i sed-kommandot inuti pythonen
- Jag förstår inte '. Vad du än gör gör ' t verkar vettigt.