[python] Python의 Bash Backticks와 동일 [duplicate]

Python의 Ruby 및 Perl에서 발견 된 백틱에 해당하는 것은 무엇입니까? 즉, Ruby에서 다음과 같이 할 수 있습니다.

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_outputPython 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. Python 3.7부터 설명하는 것과 동일한 동작을 얻으려면 다음을 사용합니다.

cpe = subprocess.run("ls", shell=True, capture_output=True)

이것은 subprocess.CompletedProcess객체 를 반환 합니다. stdout에 대한 출력은 in cpe.stdout이고 stderr에 대한 출력은 in cpe.stderr이며 둘 다 bytes객체가됩니다. 출력을 디코딩하여 str객체 를 가져 cpe.stdout.decode()오거나 다음을 전달 text=True하여 가져올 수 있습니다 subprocess.run.

cpe = subprocess.run("ls", shell=True, capture_output=True, text=True)

후자의 경우 cpe.stdoutcpe.stderr둘 다 str객체입니다.


답변

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

import commands

commands.getoutput("whoami")

산출:

‘바가 네산’


답변

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