2012-01-27 10 views
26

私はちょうどpythonから始まっているので、私は非常に単純な例に苦しんでいます。基本的に私は、実行ファイルの名前に加えて、コマンドライン引数を経由してその入力、例えば:myprogramを実行するとき、それはrefprogram.exeを実行意味し、引数refinputとしてそれに渡さPythonのコマンドラインパラメータ

python myprogram refprogram.exe refinput.txt 

を渡したいです。

res = os.system(sys.argv(1)) sys.argv(2) 
         ^
SyntaxError: invalid syntax 

誰も私が間違っているの何のアイデア:私はあり得る

import sys, string, os 
print sys.argv 

res = os.system(sys.argv(1)) sys.argv(2) 
print res 

エラーメッセージ:私はそれを次の方法を実行しようとしましたか?

私は、Python 2.7

+3

私は私のコンピュータは私にエラーマッサージを与えてほしいです。 :-) – LarsH

答えて

61

このライン

res = os.system(sys.argv(1)) sys.argv(2) 

いくつかの方法で間違っています。

まず、sys。あなたは、その内容にアクセスするために、角括弧を使用してARGVは、リストである:

sys.argv[1] 
sys.argv[2] 

第二に、あなたはあまりにも早くos.systemであなたの括弧を閉じ、そしてsys.argv(2)は、それの最後のオフにぶら下がって残っています。すべての引数の後に、閉じ括弧を行の最後まで移動したいとします。

第3に、引数をカンマで区切る必要があります。単純なスペースではできません。

あなたの最後の行は次のようになります。

res = os.system(sys.argv[1], sys.argv[2]) 
8

sys.argvがリストされ、そして例えば、角括弧を使用して索引付けさを実行していますsys.argv[1]。インデックスを付ける前にlen(sys.argv)にチェックを入れたい場合があります。

また、os.system()にパラメータを渡す場合は、os.system(' '.join(sys.argv[1:]))のようなものが望ましいかもしれませんが、空白を含む引数では機能しません。あなたはサブプロセスモジュールを使うほうがいいです。

3

sys.argvのは、あなたは、Python 2.7を実行している場合、新しいsubprocessモジュールを使用することが推奨され、リスト

import sys, string, os 
print sys.argv 

res = os.system(sys.argv[1]) sys.argv[2] 
print res 
1

です。あなたがこれを行うにははるかに、はるかに良い方法はargparse libraryである

import sys, subprocess 
result = subprocess.check_output(sys.argv[1], sys.argv[2]) 
29

を記述します。この場合

envoy wrapperライブラリでは、subprocessも使いやすくなっています。

簡単な例:

import argparse 
import envoy 

def main(**kwargs): 
    for key, value in kwargs.iteritems(): 
     print key, value 
    cmd = '{0} {1}'.format(kwargs['program'], ' '.join(kwargs['infiles'])) 
    r = envoy.run(cmd) 
    print r.std_out 
    print r.std_err 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Get a program and run it with input', version='%(prog)s 1.0') 
    parser.add_argument('program', type=str, help='Program name') 
    parser.add_argument('infiles', nargs='+', type=str, help='Input text files') 
    parser.add_argument('--out', type=str, default='temp.txt', help='name of output file') 
    args = parser.parse_args() 
    main(**vars(args)) 

これは、引数を読み込み、それらを解析し、その後、キーワードと値の辞書としてmainメソッドに送信します。これにより、事前に構築された辞書を渡すことによって、引数コードから独立してメインメソッドをテストできます。

メインの方法は、キーワードと値を出力します。次に、コマンド文字列を作成し、それを特使に渡して実行させます。最後に、コマンドの出力を表示します。

pipがインストールされている場合、envoyはpip install envoyでインストールできます。ピップを得る最も簡単な方法は、pip-installerです。

+2

初心者のスクリプトでは、大したことではないかもしれませんが、一般的には(argparseは素晴らしい)です。 – delnan

+3

@delnanそれは非常に多くの問題を解決します。弾丸を噛んでそれを学ぶ方が良いと思います。 'os.command'の代わりに' envoy'を使ってちょっと追加しました。なぜなら私は元の質問でそれを忘れてしまったからです。 –

+4

これは過度のことではありません。ユーティリティスクリプトには、永続的な制作機能が備わっています。 –

関連する問題