문제

Python의 Ruby and Perl에서 발견 된 백틱과 동일합니까? 즉, 루비에서는 이것을 할 수 있습니다.

foo = `cat /tmp/baz`

파이썬에서 동등한 진술은 어떤 모습입니까? 난 노력 했어 os.system("cat /tmp/baz") 그러나 결과를 표준으로 끌어 내고 해당 작업의 오류 코드를 나에게 반환합니다.

도움이 되었습니까?

해결책

output = os.popen('cat /tmp/baz').read()

다른 팁

가장 유연한 방법은 사용하는 것입니다 subprocess 기준 치수:

import subprocess

out = subprocess.run(["cat", "/tmp/baz"], capture_output=True)
print("program output:", out)

capture_output Python 3.7에 소개되었으며, 이전 버전의 특수 함수에 대해 check_output() 대신 사용할 수 있습니다.

out = subprocess.check_output(["cat", "/tmp/baz"])

미세한 컨트롤이 필요한 경우 하위 프로세스 객체를 수동으로 구성 할 수도 있습니다.

proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE)
(out, err) = proc.communicate()

이 모든 기능은 지원합니다 키워드 매개 변수 하위 프로세스가 정확히 실행되는 방식을 사용자 정의합니다. 예를 들어 사용할 수 있습니다 shell=True 파일 이름 확장과 같은 것이 필요한 경우 쉘을 통해 프로그램을 실행하려면 *, 그러나 그것은 함께 온다 제한.

STH가 옳습니다. os.popen ()을 사용할 수 있지만 사용 가능한 경우 (Python 2.4+) 하위 프로세스가 일반적으로 바람직합니다.

그러나 그것을 장려하는 일부 언어와는 달리, 일반적으로 언어 내에서 동일한 작업을 수행 할 수있는 하위 프로세스를 스폰하는 것은 일반적으로 나쁜 형태로 간주됩니다. 느리고 신뢰성이 떨어지고 플랫폼 의존적입니다. 예제는 다음과 같이 더 나을 것입니다.

foo= open('/tmp/baz').read()

ETA :

BAZ는 디렉토리이며 해당 디렉토리의 모든 파일의 내용을 얻으려고합니다.

? 디렉토리의 고양이는 오류가 발생합니다.

파일 목록을 원하는 경우 :

import os
foo= os.listdir('/tmp/baz')

디렉토리에있는 모든 파일의 내용을 원한다면 다음과 같은 것입니다.

contents= []
for leaf in os.listdir('/tmp/baz'):
    path= os.path.join('/tmp/baz', leaf)
    if os.path.isfile(path):
        contents.append(open(path, 'rb').read())
foo= ''.join(contents)

또는 디렉토리가 없다고 확신 할 수 있다면 한 라이너에 맞출 수 있습니다.

path= '/tmp/baz'
foo= ''.join(open(os.path.join(path, child), 'rb').read() for child in os.listdir(path))
foo = subprocess.check_output(["cat", "/tmp/baz"])

Python 3.5에서 권장되는 방법은 사용하는 것입니다. subprocess.run. 설명하는 것과 동일한 동작을 얻으려면 다음을 사용합니다.

output = subprocess.run("ls", shell=True, stdout=subprocess.PIPE).stdout

이것은 반환됩니다 bytes 물체. 당신은 추가하고 싶을 수도 있습니다 .decode("ascii") 또는 .decode("utf-8") 끝까지 a str.

가장 쉬운 방법은 명령 패키지를 사용하는 것입니다.

import commands

commands.getoutput("whoami")

산출:

'Bganesan'

import os
foo = os.popen('cat /tmp/baz', 'r').read()

사용 중입니다

(6 : 0) $ Python -Version Python 2.7.1

위의 예 중 하나는 다음과 같습니다.

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

저에게는 디렉토리 /TMP에 액세스하지 못했습니다. 하위 프로세스의 DOC 문자열을보고 교체했습니다.

"Prog", "arg"

~와 함께

"Prog Arg"

그리고 원하는 쉘 확장 거동을 얻었습니다 (La Perl의`Prog Arg ')

print subprocess.popen ( "ls -ld /tmp /v*", stdout = subprocess.pipe, shell = true) .communicate () [0


나는 Python을 사용하여 잠시 후에 종료했습니다. 파이썬이 합리적으로 만들어 졌다는 것을 알게되어 기쁩니다.

하위 프로세스를 사용하는 경우 Popen이 있으면 bufsize를 지정하십시오. 기본값은 0이므로 "합리적인 기본값을 선택"하지 않고 "부패하지 않은"것을 의미합니다.

이것은 Python3에서는 작동하지 않지만 Python2에서는 확장 할 수 있습니다. str 관습으로 __repr__ 쉘 명령을 호출하고 그렇게 반환하는 메소드 :

#!/usr/bin/env python

import os

class Command(str):
    """Call system commands"""

    def __repr__(cmd):
        return os.popen(cmd).read()

당신이 사용할 수 있습니다

#!/usr/bin/env python
from command import Command

who_i_am = `Command('whoami')`

# Or predeclare your shell command strings
whoami = Command('whoami')
who_i_am = `whoami`

그만큼 backtick (`) 운영자 제거되었다 안에 Python 3. 그것은 단일 견적과 혼란스럽게 비슷하며 일부 키보드에 입력하기가 어렵습니다. 대신 backtick, 동등한 내장 기능을 사용하십시오 repr().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top