私のコードからPythonの変数をUbuntuのシェルコマンドに送信しようとしています。誰かがそれをどうやって私を助けることができますか?現在、私はPython変数をシェルコマンドに送るには?
import os
s=5
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t s')
を持っている私は、タイムアウトの時間を言って、直接、このコマンドにs
変数を送信する代わりにしたいと思います。
私のコードからPythonの変数をUbuntuのシェルコマンドに送信しようとしています。誰かがそれをどうやって私を助けることができますか?現在、私はPython変数をシェルコマンドに送るには?
import os
s=5
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t s')
を持っている私は、タイムアウトの時間を言って、直接、このコマンドにs
変数を送信する代わりにしたいと思います。
これはすべての情報を得ることができる文字列置換操作ですhere。
また、文字列を連結することもできます。 (good tutorial)
あなたのコマンド文字列の 's'はあなたの変数の値を仮定したいと思っていますか?あなたがする必要があるのはこれです:
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t ' + str(s))
私はそれを読み違えると、あなたは5を交換するためにしようとしている場合、それは基本的に同じ
command = os.popen('stress -c ' + str(s) + ' -i 1 -m 1 --vm-bytes 128M -t s')
それは動作しますが、それは悪い習慣です。コマンドラインに含まれる値を適切にエスケープするか、コマンドをPython側のトークンに分割する必要があります。 's'が信頼できないソースから来た場合、それは'; rm -rf /; ' – viraptor
@viraptorエスケープについては同意しましたが、変数がOPのスクリプトの定数であるように見えましたので、クイックバージョンを実行するのが安全でした。 'rm -rf /'は機能しません(私はそれをテストしました)、rmはrootを削除できないので 'rm -rf/*'が必要です。それでも削除することができないファイルがいくつかありますが、それはosをほとんど使用できなくします。 – Cody
私はそれがうまくいかないことを知っています - それで、私は例の中で常に壊れたバージョンを使用しています:) – viraptor
標準subprocessモジュールを使用している:
import subprocess
s = 5
cmd = ['stress', '-c', '5', '-i', '1', '-m', '1',
'--vm-bytes', '128M', '-t', str(s)]
subprocess.call(cmd)
サブプロセスモジュールを使用すると、各引数を別々に渡すことができます。それらを文字列に変換するだけです。
's'自体の値に二重引用符が含まれていると、最初のメソッドは動作しません。 2番目の方法は、実際には唯一の信頼できる方法です。 – chepner
確かに、私はまた、2番目の方法がより信頼できることに同意します。しかし、私の場合、最初の方法が有効です。 –
外部リンクを使用して、回答全体をサポートするのではなく、回答をサポートします。 – chepner
私は答えが文字列の置換であると信じています。リンクはその方法の詳細を与えることで答えをサポートしています.... –
あなたが既に知っていなければ、外部のリソースに相談せずにこの答えを*使用する方法はありませんどのような文字列の置換操作です。クォートの問題がある場合でも、それは良い答えではありません。 – chepner