os.system의 출력을 변수에 지정하고 화면에 표시되지 않도록하십시오


305

사용하는 명령의 출력을 os.system변수 에 할당 하고 화면에 출력되지 않도록하고 싶습니다 . 그러나 아래 코드에서 출력이 화면으로 전송되고 인쇄 된 값 var은 0이며 명령이 성공적으로 실행되었는지 여부를 나타냅니다. 명령 출력을 변수에 할당하고 화면에 표시되지 않도록하는 방법이 있습니까?

var = os.system("cat /etc/services")
print var #Prints 0


4
사용하지 마십시오 os.system(도 os.popen당신 허용 대답 당) : 사용 subprocess.Popen, 그것의 방법은 더 나은!
Alex Martelli

1
@AlexMartelli, subprocess.Popen ()에서 복잡한 명령 (예 : 파이프)을 사용할 수 없지만 os.system을 사용하면
vak

2
@vak, 물론 파이프를 사용할 수 있습니다 & c w / subprocess.Popen– 그냥 추가하십시오 shell=True!
Alex Martelli

@AlexMartelli shell=True는 (일반적으로) 매우 나쁜 생각입니다! 당신은 당신이 실행하는 것을 매우 확신해야합니다 :)
Ignacio Fernández

답변:


444

"보낸 파이썬에서 강타 역 따옴표의 등가 사용할 수 있습니다 내가 오래 전에 물었다,"입니다 popen:

os.popen('cat /etc/services').read()

로부터 파이썬 3.6 문서 ,

이것은 subprocess.Popen을 사용하여 구현됩니다. 하위 프로세스를 관리하고 통신하는보다 강력한 방법은 해당 클래스의 설명서를 참조하십시오.


다음에 해당하는 코드가 있습니다 subprocess.

import subprocess

proc = subprocess.Popen(["cat", "/etc/services"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print "program output:", out

6
Walter의 subprocess.check_output솔루션은 신경 쓰지 않는 한 Pythonic one-liner에 더 가깝습니다 stderr.
chbrown

11
@ChrisBunch suprocess가 왜 더 나은 솔루션 os.popen입니까?
Martin Thoma

6
당신은 (거의) 절대로 사용해서는 안됩니다 shell=True. docs.python.org/3/library/…
dylnmc를

44
나는 이것을 계속해서 궁금해 할 때마다-한 줄의 명백한 코드가 아닌 세 줄의 복잡한 코드를 갖는 것이 더 나은 이유는 무엇입니까?
Ant6n

3
당신은 (거의) 절대로 사용하지 않아야 할뿐만 아니라이 경우 shell=True에도 올바르지 않습니다. shell=True(가) 있습니다 보다는 자식 프로세스를 cat그렇게 out하고 err의 표준 출력 / 표준 에러이다 의보다는 과정 cat과정
villapx

180

또한 subprocess전체 파이썬 popen유형 호출 제품군을 대체하기 위해 작성된 모듈 을 살펴볼 수도 있습니다 .

import subprocess
output = subprocess.check_output("cat /etc/services", shell=True)

이점은 명령을 호출하는 방법, 표준 입 / 출력 / 오류 스트림 등이 연결되는 방식에 유연성이 있다는 것입니다.


2
참고, check_outputpython 2.7 docs.python.org/2.7/library/…
phyatt

1
stderr=subprocess.STDOUT표준 오류도 캡처하기 위해 추가
Dolan Antenucci

47

명령 모듈은 다음과 같이 상당히 높은 수준의 방법입니다.

import commands
status, output = commands.getstatusoutput("cat /etc/services")

상태는 0이고 출력은 / etc / services의 내용입니다.


43
명령 모듈문서 에서 인용 : "버전 2.6부터 사용되지 않음 : 명령 모듈이 Python 3에서 제거되었습니다. 대신 서브 프로세스 모듈을 사용하십시오." .
Cristian Ciupitu

4
구식이지만 때로는 몇 줄의 코드로 빠르고 쉽게 작업을 수행하려고합니다.
anon58192932

5
@advocate 하위 프로세스의 check_output 명령을 확인하십시오. 쉽고 빠르며 곧 감가 상각되지 않습니다!
Luke Stanley

29

Python 3.5 이상 에서는 하위 프로세스 모듈에서 실행 기능 을 사용하는 것이 좋습니다 . 이것은 리턴 CompletedProcess코드뿐만 아니라 출력을 쉽게 얻을 수 있는 오브젝트를 리턴합니다. 출력에만 관심이 있으므로 이와 같은 유틸리티 래퍼를 작성할 수 있습니다.

from subprocess import PIPE, run

def out(command):
    result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
    return result.stdout

my_output = out("echo hello world")
# Or
my_output = out(["echo", "hello world"])

run ()에 대한 "capture_output = True"옵션을 잊지
마십시오

24

나는 이것이 이미 답변되었다는 것을 알고 있지만 사용 from x import x및 기능을 통해 Popen에 전화하는 더 나은 방법을 공유하고 싶었습니다 .

from subprocess import PIPE, Popen


def cmdline(command):
    process = Popen(
        args=command,
        stdout=PIPE,
        shell=True
    )
    return process.communicate()[0]

print cmdline("cat /etc/services")
print cmdline('ls')
print cmdline('rpm -qa | grep "php"')
print cmdline('nslookup google.com')

1
3 년 후, 이것이 나를 위해 일한 것입니다. 나는 이것을라는 별도의 파일에 cmd.py넣은 다음 기본 파일 from cmd import cmdline에서 필요에 따라 작성 하고 사용했습니다.
요금 KA

1
os.system에서 0을 반환하는 것과 동일한 문제가 발생했지만이 방법을 시도해 보았습니다. 그리고 보너스로 멋지고 깔끔하게 보입니다 :) 감사합니다!
Sophie Muspratt

4

os.system temp 파일로 수행합니다.

import tempfile,os
def readcmd(cmd):
    ftmp = tempfile.NamedTemporaryFile(suffix='.out', prefix='tmp', delete=False)
    fpath = ftmp.name
    if os.name=="nt":
        fpath = fpath.replace("/","\\") # forwin
    ftmp.close()
    os.system(cmd + " > " + fpath)
    data = ""
    with open(fpath, 'r') as file:
        data = file.read()
        file.close()
    os.remove(fpath)
    return data

1

파이썬 2.6과 3은 특히 stdout과 stderr에 PIPE를 사용하지 말라고 말합니다.

올바른 방법은

import subprocess

# must create a file object to store the output. Here we are getting
# the ssid we are connected to
outfile = open('/tmp/ssid', 'w');
status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile)
outfile.close()

# now operate on the file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.