2011-08-11 4 views
1

platform 패키지에서 사용되지 않는 이전 코드 인 popen을 사용하는 코드가 있습니다. 이 버전은 사용되지 않으므로이 패키지를 subprocess 패키지로 옮길 것입니다.platform.popen에서 subprocess.Popen으로 이식 중입니까?

popen("some_command")에 해당하는 내용은 무엇입니까? popen이 사용 중지 된 이유가 있습니까?

+0

간단합니다. [documentation] (http://docs.python.org/library/subprocess.html) – JBernardo

+0

설명서는 platform.popen이 아닌 os.popen을 어떻게 대체하는지 설명합니다. 정규 진술은 단순히 "platform.popen ("python some_script.py ")" – coffee

+1

* 차이가 있습니까? – JBernardo

답변

0
  • platform.popen 내가 말할 수있는 한 최선을 다하지 않았습니다. 그러나 이것은 유연성과 이식성을 이유로 사용해서는 안되는 저수준 함수입니다.

  • 다른 프로세스 실행 중 많은 것이 사용되지 않고 일부는 Python 3에서 제거되었습니다.이 작업을 수행하는 데있어 많은 시도가 Python의 역사에서 이루어졌으며 subprocess.Popen 및 그 편리한 기능이 훨씬 우수합니다. 그것의 실존 후에 다른 사람은 cruft가되고 보전되는 그들의 대부분은 레거시 부호를 지원하기 위하여 다만 거기있다.

  • 당신이 subprocess 모듈을 사용하는 포트에 코드를가는 경우, 당신이하고있다 무엇에 정확한 동등한에 대한 보이지 않는, 또는 당신이을 더있는 방법을 놓칠 것 . subprocess 설명서를 읽고 이해하고 구형 대체 방법보다 프로세스 실행 문제를 해결하는 데 사용하는 아이디어를 이해하십시오.

    subprocess.Popen은 이전 대안보다 어떻게 더 좋습니까?

    • 안전합니다.something('shell command here') 대신 Popen(['shell', 'command', 'here'])을 사용합니다. 이렇게하면 불필요한 쉘 프로세스가 시작되지 않으므로 오류 발생 가능성이 적어 위험합니다.

      사용자에게 이름 입력을 요청한 경우 고려하십시오. 나는 이전에 something('foo %s" % name)이라고 쓸 수 있습니다. 작동해야합니다 - 사용자가 "Mike"라는 이름을 부여하면 foo Mike과 같은 명령이됩니다. 하지만 사용자 이름이 "Mike Graham"이면 어떻게 될까요? 그럼 나는 foo 'Mike Graham'을 원한다. 이제는 항상 아포스트로피를 넣었지만 사용자 이름이 "Mike O'Reilley"이라면 어떻게 될까요? 더 나쁜 것은 그의 이름이 "Mike; rm -rf /"이라면 어떨까요? 여기 해결책은 직접 풀 수는 없지만 (크로스 플랫폼을하기는 어렵다.) 셸로 귀찮게하지 말고 직접 인수를 전달하는 것이다. Popen(['foo', name])`.

    • 유연합니다. 입력 및 출력을 완전히 제어 할 수 있습니다.

    • 비 차단입니다.Popen은 귀하와 동시에 프로세스를 실행할 수 있습니다.