2012-01-20 5 views
3

私はちょうどIPythonで遊んでいます。現在、私はどのように関数内のpython変数でシェルコマンドを実行することが可能だろうと思っています。例:インタラクティブなIPythonシェルの関数からシェルコマンドを呼び出す

def x(go): 
    return !ls -la {go} 

x("*.rar") 

これにより、「sh:1:構文エラー:予期しないファイルの終了」が表示されます。誰かが私の "x" -functionが "ls -la * .rar"のようなlsを呼び出せるようにする方法の手がかりを与えてもらえますか?私の作業ディレクトリに* .rarファイルがあります。あなたはhistoryコマンドの出力を見れば

は、事前に ライナー

答えて

7

をありがとう、あなたは_ip.systemメソッドを使用していますipython外部プログラムを呼び出すためにそれが表示されます。

したがって、これはあなたのために働く必要があります:あなたはおそらくsubprocess.Popenを使用する必要がありますipython

def x(go): 
    return _ip.system("ls -la {0}".format(go)) 

しかし、その外側を注意してください。

+0

こんにちはとTHXあなたの迅速な対応のために:

あなたは自分自身に変数の展開を行うことによってそれを避けることができます!私はそれを試してみたところ、 "_ip"を "_ip = get_ipython()"で取得する必要があることがわかりました。しかし、実際には "ls"の出力を解析しません。私はsubprocess.Popen()を使い続けると思います。これは悲しいことに、 "!"と同じくらい便利ではありません。 IPythonで。 Cheers、Rainer – dubbaluga

+1

システムコマンドの結果を変数 'files =!ls -la'に代入すると' files = get_ipython()。getoutput( 'ls -la foo') 'に変換されます。 –

+0

@jcollado: 'subprocess.Popen'はおそらくこれのようなもののために残忍です。 'subprocess.check_output'のようなモジュールレベルの関数を見てみましょう:http://docs.python.org/library/subprocess#subprocess.check_output –

0

おそらく@jcolladoが言ったようにsubprocess.Popenが実行されるのですが、完全性のためにすぐにシェルにコマンドを送るos.systemコマンドがあります。ただし、サブプロセス・モジュールは、ほとんどの場合、os.systemまたはos.spawnよりも優れた選択肢です。

また、何をしようとしているのかによって、コマンドをシェルに渡すのではなく、オペレーティングシステムと対話するためにpythonコマンドを使用することができます。たとえば、ファイルのリストを扱う場合、os.walkは、シェルコマンドを使用してディレクトリリストを取得するよりも、よりクリーンで移植性の高いコードになる可能性があります。 PythonのOSモジュールhereのドキュメントを見ることができます。

0

あなたが達成したい内容に応じて、これは良い方法かもしれ:

In [50]: %alias x ls -la %l 


In [51]: x *.rar 

      -rw-r--r-- 1 dubbaluga users 45254 Apr 4 15:12 schoolbus.rar 
0

この場合のためのPythonを使用して多分それが容易:

import glob 

files = glob.glob('*.rar') 
1

bugがありました」 ! " "関数スコープ変数"の拡張が失敗したシェルアクセス。あなたのipythonのバージョンが影響を受けるかもしれません。

def x(go): 
    return get_ipython().getoutput("ls -la {0}".format(go)) 
関連する問題