2016-08-17 5 views
0

私のコードからPythonの変数をUbuntuのシェルコマンドに送信しようとしています。誰かがそれをどうやって私を助けることができますか?現在、私はPython変数をシェルコマンドに送るには?

import os 
s=5 
command = os.popen('stress -c 5 -i 1 -m 1 --vm-bytes 128M -t s') 

を持っている私は、タイムアウトの時間を言って、直接、このコマンドにs変数を送信する代わりにしたいと思います。

答えて

-2

これはすべての情報を得ることができる文字列置換操作ですhere

また、文字列を連結することもできます。 (good tutorial

+0

外部リンクを使用して、回答全体をサポートするのではなく、回答をサポートします。 – chepner

+0

私は答えが文字列の置換であると信じています。リンクはその方法の詳細を与えることで答えをサポートしています.... –

+0

あなたが既に知っていなければ、外部のリソースに相談せずにこの答えを*使用する方法はありませんどのような文字列の置換操作です。クォートの問題がある場合でも、それは良い答えではありません。 – chepner

0

あなたのコマンド文字列の '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') 
+0

それは動作しますが、それは悪い習慣です。コマンドラインに含まれる値を適切にエスケープするか、コマンドをPython側のトークンに分割する必要があります。 's'が信頼できないソースから来た場合、それは'; rm -rf /; ' – viraptor

+0

@viraptorエスケープについては同意しましたが、変数がOPのスクリプトの定数であるように見えましたので、クイックバージョンを実行するのが安全でした。 'rm -rf /'は機能しません(私はそれをテストしました)、rmはrootを削除できないので 'rm -rf/*'が必要です。それでも削除することができないファイルがいくつかありますが、それはosをほとんど使用できなくします。 – Cody

+1

私はそれがうまくいかないことを知っています - それで、私は例の中で常に壊れたバージョンを使用しています:) – viraptor

4

標準subprocessモジュールを使用している:

import subprocess 
s = 5 
cmd = ['stress', '-c', '5', '-i', '1', '-m', '1', 
     '--vm-bytes', '128M', '-t', str(s)] 
subprocess.call(cmd) 

サブプロセスモジュールを使用すると、各引数を別々に渡すことができます。それらを文字列に変換するだけです。

+2

's'自体の値に二重引用符が含まれていると、最初のメソッドは動作しません。 2番目の方法は、実際には唯一の信頼できる方法です。 – chepner

+0

確かに、私はまた、2番目の方法がより信頼できることに同意します。しかし、私の場合、最初の方法が有効です。 –

関連する問題