web-dev-qa-db-ja.com

Pythonコマンドラインパラメーター

私はpythonで始めているので、非常に簡単な例に苦労しています。

python myprogram refprogram.exe refinput.txt

つまり、myprogramを実行すると、refprogram.exeを引数refinputとして渡します。私はそれを次のようにしようとしました:

import sys, string, os
print sys.argv

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

表示されるエラーメッセージは次のとおりです。

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

誰が私が間違っているのか考えていますか?

私はPython 2.7を実行しています

25
Patrick

この行

_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])
_
61
Ian Clelland

これを行うはるかに良い方法は、 argparse library を使用することです。 envoy wrapper ライブラリにより、 サブプロセス の操作も容易になります。

簡単な例:

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メソッドは、キーワードと値を出力します。次に、コマンド文字列を作成し、それをenvoyに渡して実行します。最後に、コマンドからの出力を印刷します。

Pipがインストールされている場合は、pip install envoy。 pipを取得する最も簡単な方法は、 pip-installer を使用することです。

29
Spencer Rathbun

_sys.argv_はリストであり、角括弧を使用してインデックスが付けられます。 _sys.argv[1]_。インデックスを作成する前に、len(sys.argv)を確認することもできます。

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

8
FatalError

sys.argvはリストです

import sys, string, os
print sys.argv

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

Python 2.7を実行している場合は、新しい subprocess モジュールを使用することをお勧めします。

この場合、あなたは書くだろう

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