하위 프로세스 호출을 텍스트 파일로 어떻게 파이프합니까?


95
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])

이제 내가 실행하는 스크립트가 있습니다. 내가 그것을 실행하고이 줄에 닿으면 run.sh에 인쇄가 있기 때문에 인쇄를 시작합니다.

이것을 텍스트 파일로 어떻게 파이프합니까? (가능하면 인쇄하십시오)

답변:


176

출력을 파일에 쓰고 싶다면 stdout -argument of subprocess.call.

그것은 소요 None, subprocess.PIPE, 파일 객체 또는 파일 기술자를. 첫 번째는 기본값이며 stdout은 부모 (스크립트)에서 상속됩니다. 두 번째는 한 명령 / 프로세스에서 다른 명령 / 프로세스로 파이프 할 수 있습니다. 세 번째와 네 번째는 출력을 파일에 기록하려는 것입니다.

다음과 같은 파일을 열고 open객체 또는 파일 설명자 정수를 call다음으로 전달해야합니다 .

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)

소켓 (gasp :))처럼 유효한 파일과 같은 객체가 작동 할 것이라고 생각하지만 시도한 적이 없습니다.

marcog 가 주석에서 언급 했듯이 stderr을 리디렉션하고 싶을 수도 있으므로 stderr=subprocess.STDOUT. 위에서 언급 한 값 중 하나라도 작동하므로 다른 위치로 리디렉션 할 수 있습니다.


6
subprocess.call ([ "echo", "1", ">>", "t.txt"])이 작동하지 않는 이유는 무엇입니까?
StackOverflowOfficial

7
@Goldname 리디렉션을 수행하려면 쉘이 필요하므로 : subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)작동해야합니다.
Wes Mason

@WesMason 감사합니다.하지만 subprocess.call이 기본적으로 셸에 복사하여 붙여 넣는 것과 같은 방식으로 작동한다고 생각 했습니까?
StackOverflowOfficial

2
@Goldname nah, 하위 프로세스의 모든 것은 프로세스를 여는 기본 Popen 클래스에 의존합니다. shell = True는 프로세스가 시스템 기본 셸에서 실행되도록 강제합니다 (예 : POSIX 시스템의 경우 / bin / sh, 일반적으로 bash 또는 dash). ), 셸에서 제공하는 모든 추가 기능 (사용자가 제공 한 데이터를 전달하면 자체적으로 악용되는 전체 프로그래밍 언어)에 개방되지 않으므로 더 안전합니다. 또한 shlex.quote더티 데이터를 서브 쉘에 전달 하고 있는지 살펴보십시오 .
Wes Mason

4
완료 한 후에도 파일을 닫아야합니까? 작업이 끝나면 파일이 닫힙니다. with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel
alper

19

에 대한 옵션 popen은 다음에서 사용할 수 있습니다.call

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0

그래서...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)

그런 다음 원하는 작업을 수행 할 수 있습니다 myoutput(파일 btw 여야 함).

또한 이와 같이 파이프 된 출력에 더 가까운 작업을 수행 할 수 있습니다.

dmesg | grep hda

다음과 같습니다.

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

파이썬 매뉴얼 페이지 에는 사랑스럽고 유용한 정보가 많이 있습니다 .


-2

도움이된다면 터미널에서 스크립트를 호출하여 모든 것을 파일로 출력 할 수도 있습니다. 이 방법:

$ /path/to/the/script.py > output.txt

파일을 덮어 씁니다. >>추가하는 데 사용할 수 있습니다 .

파일에도 오류가 기록되도록하려면 &>>또는을 사용하십시오 &>.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.