하위 프로세스 popen Python을 사용하는 방법


102

os.popen이 subprocess.popen으로 대체되었으므로 어떻게 변환해야할지 궁금합니다.

os.popen('swfdump /tmp/filename.swf/ -d')

subprocess.popen ()에

나는 시도했다 :

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
                                                # containing /tmp/filename.swf

그러나 나는 이것을 제대로 작성하지 않고 있다고 생각합니다. 어떤 도움을 주시면 감사하겠습니다. 감사


1
Windows 시스템입니까 아니면 Linux 시스템입니까?
AAI

답변:


141

subprocess.Popen 인수 목록을받습니다.

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

도있어 문서의 섹션 에서 사용자 마이그레이션을 돕는 헌신 os.popen에가 subprocess.


18
@HansThen shell=True은 권장 되지 않습니다.
Pierre GM

7
@Lukas Graf 코드에서 그렇게 말하고 있기 때문에. @Alex shell = True는 신뢰할 수없는 데이터를 처리하는 데 사용될 때 보안 위험으로 간주됩니다. 영리한 공격자는 입력을 수정하여 임의의 시스템 명령에 액세스 할 수 있습니다. 예를 들어 filename.swf; rm -rf /파일 이름 값을 입력 합니다. 그러나 이것은 Popen에 대한 귀하의 주장 내용이 안전하지 않은 경우에만 문제입니다.
Hans Then

10
@Lukas Graf 코드 조각에서 나는 이것이 신뢰할 수없는 사용자 제공 데이터로 채워지는 예제 값을 의미한다고 강력히 의심합니다. 그러나 나는 그 항목에 대해 휴전을 부를 준비가되어있다. 신뢰할 수없는 입력 을 사용하는 경우 shell=True외에는 사용하지 않을 이유가 없다는 점이 포인트 입니다. 권장하지 않음을 단순히 언급하는 것은 잘못된 것입니다. shell=True
Hans Then

7
@HansThen : 추신 : 오해하지 마세요, 나는 여기서 당신의 사건을 다루려고하지 않습니다. 와 관련된 위험을 알고있는 것 같지만 shell=True이 질문을 가로막는 임의의 사용자는 그렇지 않을 수 있습니다. 그래서 shell=True당신이 무엇을하고 있는지 정확히 알지 못한다면 실제로는 권장되지 않는다는 점 을 강조하는 것이 중요하다고 생각합니다 .
Lukas Graf

4
@Blender 아무도 그것이 해롭다 고 말하지 않았습니다. 그것은 단지 위험합니다. 그러나 그 외에는 당신의 주장은 전혀 의미가 없습니다. Python 표준 라이브러리가 노출하는 많은 OS 함수는 잠재적으로 위험 shutil.rmtree합니다. 예를 들어 보겠습니다. 그러나 그것은 그들이 stdlib에 포함되는지 여부와 관련이 없습니다. 나는 "유닉스는 사용자가 어리석은 일을하는 것을 막기 위해 고안된 것이 아니다. 그것은 또한 그들이 영리한 일을하는 것을 막을 수 있기 때문" 이라고 믿는다 . 또한 Python에 많은 부분을 적용합니다.
Lukas Graf

9

sh를 사용 하면 일이 훨씬 쉬워집니다.

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

2
sh, 좋지만 하위 프로세스의 Popen과 동일하지 않습니다. sh는 하위 프로세스 호출과 비슷합니다.
liuyang1 2015-07-20

-1

가장 쉬운 방법으로 Subprocess 사용 !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.