web-dev-qa-db-ja.com

pythonでsys.argvを使用して引数の長さをチェックし、スクリプトとして実行できるようにする方法は?

さて、ここに私のコードの一部があります(私はsysをインポートしました)

if __name__ == '__main__':


MyCaesarCipher = CaesarCipher() #MyCaesarCipher IS a CaesarCipher()

if len(sys.argv) >1:
    #what will it check? 

Done = False   
while not Done:
    print('C Clear All')
    print('L Load Encrypted File')
    print('R Read Decrypted File')
    print('S Store Encrypted File')
    print('W Write Decrypted File')
    print('O Output Encrypted Text')
    print('P Print Decrypted Text')
    print('E Encrypt Decrypted Text')
    print('D Decrypted Encrypted Text')
    print('Q Quit')
    print('----------------')
    print('Enter Choice>')

つまり、コマンドラインの長さが1を超える場合、プログラムはスクリプトとして実行されます。

これは指示です:

コマンドライン引数が入力されていない場合、スクリプトはメニューモードに入ります。スクリプトの実行中に複数のコマンドライン引数(スクリプト名以外)が指定された場合、スクリプトはシングル実行モードになります。

しかし、これが何を意味するのかわかりません。

5
Elsa

sys.arvg:とは

Pythonスクリプトに渡されるコマンドライン引数のリスト。argv[0]はスクリプト名です。

デモ:ファイル名:1.py

import sys

if __name__=="__main__":
    print "command arguments:", sys.argv 

出力:

$ python 1.py arg1 arg2 
command arguments: ['1.py', 'arg1', 'arg2']
$ python 1.py
command arguments: ['1.py']

あなたの問題は、コマンドライン引数とメニューによってもコードを実行する必要があるということです。

ユーザーがコマンドラインからEnterChoiceを指定したら、指定された値を使用して次のプロセスに進みます。

ユーザーがコマンドラインから選択肢の入力を提供しなかった場合は、メニューから選択肢の入力をユーザーに依頼します。

デモ:

ファイル名:1.py

import sys

if __name__ == '__main__':
    try:
        arg_command = sys.argv[1]
    except IndexError:
        arg_command = ""

    Done = False
    while not Done:
        if arg_command=="":
            print('\nMenu')
            print('C Clear All')
            print('L Load Encrypted File')
            print('Q Quit')
            print('----------------')
            print('Enter Choice>')
            command = raw_input('Enter Selection> ').strip()[0].upper()
        else:
            command = arg_command
            #- set arg value to empty to run Menu option again.
            arg_command = ""

        if command == 'C':
            print "In Clear All event."
        Elif command == 'L':
            print "In Clear All event."
        Elif command == "Q":
            break
        else:
            print "Wrong Selection."

出力:

コマンドラインから選択を入力します。

$ python 1.py C
In Clear All event.

Menu
C Clear All
L Load Encrypted File
Q Quit
----------------
Enter Choice>
Enter Selection> q
$ 

コマンドライン引数はありません。

$ python 1.py

Menu
C Clear All
L Load Encrypted File
Q Quit
----------------
Enter Choice>
Enter Selection> l
In Clear All event.

Menu
C Clear All
L Load Encrypted File
Q Quit
----------------
Enter Choice>
Enter Selection> q
$ 
6
Vivek Sable

これが、このような言語を学んでいるとき、本当に理解できないことを印刷するだけで、かなりうまくいくことがよくあるということです。

これを試して:

ステップ1)次のようなプログラムを作成します。

_import sys
if __name__ == '__main__':
    for idx, arg in enumerate(sys.argv):
       print("arg #{} is {}".format(idx, arg))
    print len(sys.argv)
_

その後、次のようにコマンドラインからプログラムを実行します。

_$ python3 test_script.py
_

次に、次のように実行します。

_$ python3 test_script.py somearg someother andanother etc "23908452359"
_

あなたが発見したことは、あなたが解決しようとしているこのタスクを実行するのに役立つかもしれません。

最後に、「メニューモード」は、スクリプトがユーザーからの入力を受け取るように聞こえます。したがって、これを行うにはinput()を使用する必要があります。また、メニューモードをいつ使用するかを決定する必要があるようです。これは、上記のif-testですでに開始しています。

ただし、少し実験してみれば、理解できるでしょう。

3
erewok

命令では、スクリプトがコマンドライン引数を使用してスクリプトを実行する必要があります。

python script.py [arg1] [arg2] [arg3] ....

Argsにはsys.argvからアクセスできます。

sys.argv = ['script.py', '[arg1]', '[arg2]', '[arg3]']

引数が存在する場合は、メニューインターフェイスの代わりにコマンドラインインターフェイスを使用する必要があります。

3
Leland Barton

pythonに慣れていないようですので、コードを使用した簡単な例を次に示します。メニューとメニューオプションの実際のコードを完成させる必要がありますが、sys.argvを使用します。

import sys

def menu():
    Done = False   
    while not Done:
        print('C Clear All')
        print('L Load Encrypted File')
        print('R Read Decrypted File')
        print('S Store Encrypted File')
        print('W Write Decrypted File')
        print('O Output Encrypted Text')
        print('P Print Decrypted Text')
        print('E Encrypt Decrypted Text')
        print('D Decrypted Encrypted Text')
        print('Q Quit')
        print('----------------')
        print('Enter Choice>') #should get user input here
        Done = True

if __name__=="__main__" :
    if len(sys.argv) > 1 : 
    #Here if an argument is present run it or load the menu
        print "run whatever option was entered on the commandline"
    else:
        menu()

まず、argvが何であるかを理解し、このスクリプトを作成してみて、learning_argv.pyと呼ぶ必要があります。

import sys

print(sys.argv)

次のようにスクリプトを実行してみてください。

$ python3 learning_argv.py
$ python3 learning_argv.py a
$ python3 learning_argv.py a b c
$ python3 learning_argv.py AWESOME TEXT

argvとは何ですか?

argvの長さが1より大きいかどうかをテストするときに行っていることは、基本的に、スクリプト名以外のものを受け取っているかどうかをテストすることです。

将来的には、メニュー用に作成したのと同様の構造を作成して、コマンドラインから直接送信された引数を処理することができます。

argvをよりよく理解するために、このクイック チュートリアル を見てください。

1
caynan