python + os.system에서 오는 값을 인쇄하는 방법

이 간단한 Python 스크립트가 실제 redhat 버전을 인쇄하지 않는 이유는 무엇입니까?

version = os.system( " cat /etc/redhat-release | awk \"{print $7}\" " ) print ("my version is " ,version) 

실행했을 때

:

7.2 ("my version is ", 0) 
  1. 이유 0 대신 7.2?
  2. OS.system에서 버전 7.2를 가져 오는 것을 피하는 방법은 무엇입니까?

댓글

  • Python2 또는 Python3?
  • SO로 이동해야합니까?

Answer

os.system()는 프로세스 만 실행하고 출력을 캡처하지는 않습니다.

명령이 출력을 생성하면 인터프리터 표준 출력 스트림으로 전송됩니다.

반환 값은 다음과 같습니다. 프로세스의 종료 코드 :

Unix에서 반환 값은 wait ()에 지정된 형식으로 인코딩 된 프로세스의 종료 상태입니다.

subprocess.check_output() 또는

직접 출력을 캡처합니다.

>>> arch = subprocess.check_output("uname -a | awk "{print $9}"", shell=True); >>> arch "x86_64\n" 

댓글

  • 좋습니다. 그러나 위의 예에서 " \ n "없이 x86_64 만 캡처하는 방법은 무엇입니까?
  • @janga , use arch [:-1]?
  • ok, works, 또 다른 마지막 질문, os.system에서 인쇄를 피하는 방법, 예 : os.system (' sed -is " /7.0/$new_version/g " / tmp / file), 교체 할 문자열을 출력합니다.
  • 줄 바꿈을 제거하려면 .rstrip()
  • 를 사용하십시오.

  • 모든 구문을 보여줄 수 있습니까?

Answer

subprocess 모듈을 사용하여이 작업을 매우 쉽게 수행 할 수 있습니다.

#!/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()) 

awk 부분에서는 sed "s/[^0-9_.-]//g /etc/redhat-release를 사용할 수 있습니다. 이렇게하면 버전 번호 만 추출되며 “플랫폼 독립성을 높이기 위해 필드 버전 번호가 무엇인지 알 필요가 없습니다.

댓글

  • 는 이 변수 (버전)는 " \ n "가 없습니다. 나중에이 변수를 파이썬 내부의 sed 명령에서 사용하고 싶기 때문입니다.
  • ' 질문을받지 못했습니다. 무엇을 하던지 ' 이치가없는 것 같습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다