proč tento jednoduchý skript v pythonu nevytiskne skutečnou verzi redhat?
version = os.system( " cat /etc/redhat-release | awk \"{print $7}\" " ) print ("my version is " ,version)
když to spustím
dostali jsme:
7.2 ("my version is ", 0)
- proč dostaneme 0 místo 7.2?
- jak se vyhnout získání verze – 7.2 z os.system?
komentáře
- Python2 nebo Python3?
- Mělo by to být přesunuto do SO?
Odpovědět
os.system()
právě spustí proces , nezachytí výstup:
Pokud příkaz generuje jakýkoli výstup, bude odeslán do standardního výstupního proudu tlumočníka.
Návratová hodnota je kód ukončení procesu:
V systému Unix je návratovou hodnotou stav ukončení procesu zakódovaný ve formátu určeném pro wait ().
Budete muset použít něco jako
subprocess.check_output()
nebosubprocess.Popen()
přímo k zachycení výstupu.>>> arch = subprocess.check_output("uname -a | awk "{print $9}"", shell=True); >>> arch "x86_64\n"
Komentáře
- ok, ale jak zachytit pouze x86_64 bez " \ n "?
- @janga pro výše uvedený příklad , použít arch [: – 1]?
- ok, funguje, další poslední otázka, jak se vyhnout tisku z os.system, například os.system (' sed -is " /7.0/$new_version/g" / tmp / file), vytiskne řetězec, který chceme nahradit
- Chcete-li odstranit nový řádek, použijte
.rstrip()
- můžete mi prosím ukázat veškerou syntaxi?
Odpověď
Můžete použít modul subprocess
a dosáhnout toho celkem snadno.
#!/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())
Také pro awk
část, můžete použít sed "s/[^0-9_.-]//g /etc/redhat-release
. Tím se extrahuje pouze číslo verze a nemusíte vědět, jaké je číslo verze pole, díky čemuž je nezávislejší na platformě.
Komentáře
- je tato proměnná – verze – je bez " \ n ", protože tuto proměnnou chci použít později v příkazu sed uvnitř pythonu
- Nedostávám ' tvou otázku. Ať děláš cokoli, zdá se, že ' to nedává smysl.