명령 줄에서 수행하는 작업 :
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
명령 줄에서 수행하는 작업 :
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.sendfile()
기반 솔루션이 가능합니다. python에서 unix cat 명령 재현
답변:
업데이트 : 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)
os.system
하고 os.system
정확하게 모델링 할 수 있지만 작업하기가 더 복잡합니다.
os.system
전에 왔습니다 subprocess
. 전자는 후자가 대체하려는 레거시 API입니다.
os.system()
또는 shell=True
. 하위 프로세스의 출력을 리디렉션하려면 Ryan Thompson의 답변에stdout
표시된대로 매개 변수를 사용하십시오 . 귀하의 경우 에는 하위 프로세스 ( ) 가 필요하지 않지만 순수 Python을 사용하여 파일을 연결할 수 있습니다. cat
에서 파이썬 3.5 출력을 리디렉션, 단지에 대한 열린 파일 핸들을 전달 stdout
하는 인수 subprocess.run
:
# 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.run(my_cmd, stdout=outfile)
다른 사람들이 지적했듯이 cat
이러한 목적으로 외부 명령을 사용하는 것은 완전히 관련이 없습니다.
subprocess.run(my_cmd, stdout=outfile)
대체되는 Python 3.5 이상 사용의 경우subprocess.call(...)
@PoltoS 일부 파일을 결합한 다음 결과 파일을 처리하고 싶습니다. 고양이를 사용하는 것이 가장 쉬운 대안이라고 생각했습니다. 더 나은 / pythonic 방법이 있습니까?
물론이야:
with open('myfile', 'w') as outfile:
for infilename in ['file1', 'file2', 'file3']:
with open(infilename) as infile:
outfile.write(infile.read())
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에서 실행할 수 있습니다. 유닉스에서 실행됩니다.
for line in .readlines():
, s +=
)과 proc.kill()
) 일반적으로 정보가 손실 될 수 있습니다 (이 서브 프로세스는 유닉스 (정상적으로 종료 할 수 없습니다 - h 제되지 않은 내용이 손실됩니다 ). 어쨌든 버퍼링에 대한 메모는 주석으로 더 적절합니다.
shlex.split()
, drop shell=True
, drop >file
, drop open()
등을 사용하고 stdout=PIPE
, Timer(1, proc.terminate).start()
; output = proc.communicate()[0]
대신. 여기에 완전한 예가 있습니다. 추가 솔루션 : 중단없이 Python에서 프로세스 출력 읽기를 중지 하시겠습니까? 참고 : 자식 프로세스를 수동으로 종료해야한다는 질문에 대한 요구 사항은 없습니다. 다른 문제를 해결할 수 있습니다. 예를 들어 표준 출력이 tty이지만 주제를 벗어난 경우 프로세스가 다르게 동작 할 수 있습니다.