サブプロセス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 2017

回答:


141

subprocess.Popen 引数のリストを取ります:

from subprocess import Popen, PIPE

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

ユーザーがからへの移行を支援するためのドキュメントのセクションもあります。os.popensubprocess


18
@HansThen shell=Trueは推奨されません
ピエール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:PS誤解しないでください。私はここであなたのケースを取り上げようとはしていません。に関連するリスクを認識しているように見えるだけですshell=Trueが、この質問を偶然見つけたユーザーは気づかない可能性があります。そのためshell=True、自分が何をしているかを正確に理解していない限り、実際には推奨されないことを強調することが重要だと私は思います。
Lukas Graf

4
@Blender誰もそれが有害だとは言っていません-それは単に危険です。しかし、それを除けば、あなたの主張はまったく意味がありません。Python標準ライブラリが公開する多くのOS関数は潜在的に危険です- shutil.rmtree例えば。しかし、それらがstdlibに含まれているかどうかには関係ありません。UNIXの哲学である「Unixは、ユーザーが愚かなことをするのを阻止するようには設計されていません。これは、ユーザーが愚かなことをするのも阻止するからです」。大部分はPythonにも適用されます。
Lukas Graf

9

shを使用すると、物事がずっと簡単になります:

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

2
sh、それは良いですが、サブプロセスのPopenと同じではありません。shはサブプロセスの呼び出しと似ています。
liuyang1 2015

-1

最も簡単な方法でサブプロセスを使用する!!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)

使用shell=Trueを避け、代わりに引数のリストを渡します(例:)subprocess.call(['pip', 'install', 'numpy'])shell=Trueある安全でないユーザ提供の入力には、(それらが引数をコントロールしている場合、ユーザは任意のコマンドを実行することができる)、および引用ルールをシェルに起因し使用することがより難しいです。
クリスウォリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.