如何在 python 中使用 sys.argv 来检查参数的长度,以便它可以 运行 作为脚本?

How to use sys.argv in python to check length of arguments so it can run as script?

好的,这是我的部分代码(我导入了 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,程序将作为脚本运行。

这是指令:

If no command line arguments are input, then the script enters menu mode. If more than 1 command line argument (anything other than script name) is provided during the run of the script it enters single run mode.

虽然我不知道这是什么意思。

事情是这样的,当你学习一门这样的语言时,你通常只需打印出你并不真正理解的东西就可以了。

试试这个:

第 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"

您发现的内容可能对执行您希望解决的任务有用。

最后,"menu mode" 听起来脚本将接受用户的输入。因此,您需要使用 input() 来做到这一点。听起来您还需要决定何时使用菜单模式,您已经开始使用上面的 if-test 来做这件事。

不过,稍微试验一下,您就会明白的。

指令希望脚本使用命令行参数来执行脚本。

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

参数可通过 sys.argv 访问。

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

存在参数时,您将需要使用命令行界面而不是菜单界面。

由于您对 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 时,您所做的基本上是测试您是否收到脚本名称以外的任何内容。

将来,您可以创建一个与您为菜单创建的结构类似的结构,以处理直接从命令行发送的参数。

快速浏览一下 tutorial 以便更好地理解 argv

什么是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']

您的问题是,我们必须 运行 通过命令行参数和菜单进行编码。

当用户从命令行提供 Enter Choice 时,然后将提供的值用于下一个过程。

如果用户未从命令行提供输入选项,则要求用户从菜单中输入选项。

演示:

文件名: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
$