platform
パッケージの古い非推奨のバージョンpopen
を使用するコードがあります。これは廃止予定ですので、これをsubprocess
パッケージに移動します。platform.popenからサブプロセスにポーティングする.Popen?
popen("some_command")
と同等の文は何ですか? popenが非難された理由はありますか?
platform
パッケージの古い非推奨のバージョンpopen
を使用するコードがあります。これは廃止予定ですので、これをsubprocess
パッケージに移動します。platform.popenからサブプロセスにポーティングする.Popen?
popen("some_command")
と同等の文は何ですか? popenが非難された理由はありますか?
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
はあなたと同時にプロセスを実行できます。
です。 [documentation](http://docs.python.org/library/subprocess.html) – JBernardo
を参照してください。documentationは、platform.popenではなくos.popenの置き換え方法について説明しています。通常の文は単に "platform.popen(" python some_script.py ")" – coffee
です。*違いはありますか? – JBernardo