2011-08-11 11 views
1

platformパッケージの古い非推奨のバージョンpopenを使用するコードがあります。これは廃止予定ですので、これをsubprocessパッケージに移動します。platform.popenからサブプロセスにポーティングする.Popen?

popen("some_command")と同等の文は何ですか? popenが非難された理由はありますか?

+0

です。 [documentation](http://docs.python.org/library/subprocess.html) – JBernardo

+0

を参照してください。documentationは、platform.popenではなくos.popenの置き換え方法について説明しています。通常の文は単に "platform.popen(" python some_script.py ")" – coffee

+1

です。*違いはありますか? – JBernardo

答えて

0
  • platform.popen私が知る限り最善の方法ではありません。しかし、これは低レベルの機能であり、柔軟性と移植性の理由から使用すべきではありません。

  • 多くの他のプロセス起動用のものは廃止され、Python 3では削除されました。これはPythonの歴史のなかで多く試みられており、subprocess.Popenとその便利機能がはるかに優れています。その存在の後に他の人たちは混乱し、残っているもののほとんどはレガシーコードをサポートするためだけにあります。あなたが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はあなたと同時にプロセスを実行できます。

関連する問題