私は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を実行しています
この行
_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])
_
これを行うはるかに良い方法は、 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 を使用することです。
_sys.argv
_はリストであり、角括弧を使用してインデックスが付けられます。 _sys.argv[1]
_。インデックスを作成する前に、len(sys.argv)
を確認することもできます。
また、パラメータをos.system()
に渡したい場合は、os.system(' '.join(sys.argv[1:]))
のようなものが必要かもしれませんが、スペースを含む引数では機能しません。サブプロセスモジュールを使用する方が良いでしょう。
sys.argvはリストです
import sys, string, os
print sys.argv
res = os.system(sys.argv[1]) sys.argv[2]
print res
Python 2.7を実行している場合は、新しい subprocess
モジュールを使用することをお勧めします。
この場合、あなたは書くだろう
import sys, subprocess
result = subprocess.check_output(sys.argv[1], sys.argv[2])