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_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
. 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.stdout
및 cpe.stderr
둘 다 str
객체입니다.
답변
가장 쉬운 방법은 명령 패키지를 사용하는 것입니다.
import commands
commands.getoutput("whoami")
산출:
‘바가 네산’
답변
import os
foo = os.popen('cat /tmp/baz', 'r').read()