IT story

Python에서 하위 프로세스로 출력을 리디렉션하는 방법은 무엇입니까?

hot-time 2020. 9. 10. 19:02
반응형

Python에서 하위 프로세스로 출력을 리디렉션하는 방법은 무엇입니까?


명령 줄에서 수행하는 작업 :

cat file1 file2 file3 > myfile

파이썬으로하고 싶은 것 :

import subprocess, shlex
my_cmd = 'cat file1 file2 file3 > myfile'
args = shlex.split(my_cmd)
subprocess.call(args) # spits the output in the window i call my python program

업데이트 : os.system은 권장되지 않지만 Python 3에서는 여전히 사용할 수 있습니다.


사용 os.system:

os.system(my_cmd)

정말로 하위 프로세스를 사용하려는 경우 솔루션은 다음과 같습니다 (대부분 하위 프로세스에 대한 문서에서 가져옴).

p = subprocess.Popen(my_cmd, shell=True)
os.waitpid(p.pid, 0)

OTOH, 시스템 호출을 완전히 피할 수 있습니다.

import shutil

with open('myfile', 'w') as outfile:
    for infile in ('file1', 'file2', 'file3'):
        shutil.copyfileobj(open(infile), outfile)

원래 질문에 답하고 출력을 리디렉션하려면 stdout인수에 대한 열린 파일 핸들을 다음으로 전달하십시오 subprocess.call.

# Use a list of args instead of a string
input_files = ['file1', 'file2', 'file3']
my_cmd = ['cat'] + input_files
with open('myfile', "w") as outfile:
    subprocess.call(my_cmd, stdout=outfile)

그러나 다른 사람들이 지적했듯이 cat이러한 목적으로 외부 명령을 사용하는 것은 완전히 관련이 없습니다.


@PoltoS 일부 파일을 결합한 다음 결과 파일을 처리하고 싶습니다. 고양이를 사용하는 것이 가장 쉬운 대안이라고 생각했습니다. 더 나은 / pythonic 방법이 있습니까?

물론이야:

with open('myfile', 'w') as outfile:
    for infilename in ['file1', 'file2', 'file3']:
        with open(infilename) as infile:
            outfile.write(infile.read())

한 가지 흥미로운 경우는 유사한 파일을 추가하여 파일을 업데이트하는 것입니다. 그러면 프로세스에서 새 파일을 만들 필요가 없습니다. 큰 파일을 추가해야하는 경우 특히 유용합니다. 다음은 파이썬에서 직접 teminal 명령 줄을 사용하는 한 가지 가능성입니다.

import subprocess32 as sub

with open("A.csv","a") as f:
    f.flush()
    sub.Popen(["cat","temp.csv"],stdout=f)

size = 'ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 dump.mp4 > file'
proc = subprocess.Popen(shlex.split(size), shell=True)
time.sleep(1)
proc.terminate() #proc.kill() modify it by a suggestion
size = ""
with open('file', 'r') as infile:
    for line in infile.readlines():
        size += line.strip()

print(size)
os.remove('file')

subprocess 를 사용 하면 프로세스가 종료되어야합니다. 이는 예입니다. process를 종료하지 않으면 파일 이 비어 있고 아무것도 읽을 수 없습니다 . Windows에서 실행할 수 있습니다. 유닉스에서 실행됩니다.

참고 URL : https://stackoverflow.com/questions/4965159/how-to-redirect-output-with-subprocess-in-python

반응형