将字符串作为Python命令行参数传递

将字符串作为Python命令行参数传递,python,Python,我能够将int和chars作为Python命令行参数传递,但无法成功地将字符串传递给以下对象: if __name__ == '__main__' : try : print(len(sys.argv)) arg1 = ast.literal_eval(sys.argv[1]) arg2 = ast.literal_eval(sys.argv[2]) print(arg1) print(arg2) e

我能够将int和chars作为Python命令行参数传递,但无法成功地将字符串传递给以下对象:

if __name__ == '__main__' :
    try :
        print(len(sys.argv))
        arg1 = ast.literal_eval(sys.argv[1])
        arg2 = ast.literal_eval(sys.argv[2])
        print(arg1)
        print(arg2)
    except Exception :
        print('error')
以下工作:

python test.py 1 2
和打印:

3
1
2
如下:

if __name__ == '__main__' :
    try :
        print(len(sys.argv))
        arg1 = ast.literal_eval(sys.argv[1])
        arg2 = ast.literal_eval(sys.argv[2])
        print(arg1)
        print(arg2)
    except Exception :
        print('error')
python test.py“1”“2”

它也会打印

3
1
2
但是,以下情况不起作用:

python test.py ‘one’ ‘two’
它可以看到arg的数量,但在尝试获取arg时抛出异常:

3
error
有人能提供一些关于如何将字符串作为命令行参数传递的指导吗


谢谢。

您的shell将在python看到这些引用之前吃掉它们。试着这样做:

python test.py '"one"' '"two"'
from optparse import OptionParser
if __name__ == "__main__":
    parser = OptionParser(version="%prog 1.0.0")
    parser.add_option("-c", "--config", action="store", dest="config_file",
                      default="test", type="string",
                      help="let prog load a specified configure file")
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      default=False, help="let prog run in verbose model")
    options, args = parser.parse_args()
    if options.verbose:
        print "run in verbose model"
    print "configure file is %s"%(options.config_file)
另一方面,命令行参数无论如何都是作为字符串传递的。像这样评价他们是很奇怪的;更好的模式是在需要数字时将字符串转换为数字,否则就将其作为字符串保留。这也将使您不必在命令行中引用填充字符串两次


argparse
模块可以自动为您处理这些内容

您的shell将在python看到这些引用之前吃掉它们。试着这样做:

python test.py '"one"' '"two"'
from optparse import OptionParser
if __name__ == "__main__":
    parser = OptionParser(version="%prog 1.0.0")
    parser.add_option("-c", "--config", action="store", dest="config_file",
                      default="test", type="string",
                      help="let prog load a specified configure file")
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      default=False, help="let prog run in verbose model")
    options, args = parser.parse_args()
    if options.verbose:
        print "run in verbose model"
    print "configure file is %s"%(options.config_file)
另一方面,命令行参数无论如何都是作为字符串传递的。像这样评价他们是很奇怪的;更好的模式是在需要数字时将字符串转换为数字,否则就将其作为字符串保留。这也将使您不必在命令行中引用填充字符串两次


argparse
模块可以自动为您处理这些内容

optparse.OptionParser
可能对您有所帮助

您可以这样使用它:

python test.py '"one"' '"two"'
from optparse import OptionParser
if __name__ == "__main__":
    parser = OptionParser(version="%prog 1.0.0")
    parser.add_option("-c", "--config", action="store", dest="config_file",
                      default="test", type="string",
                      help="let prog load a specified configure file")
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      default=False, help="let prog run in verbose model")
    options, args = parser.parse_args()
    if options.verbose:
        print "run in verbose model"
    print "configure file is %s"%(options.config_file)

optparse.OptionParser
可能对您有所帮助

您可以这样使用它:

python test.py '"one"' '"two"'
from optparse import OptionParser
if __name__ == "__main__":
    parser = OptionParser(version="%prog 1.0.0")
    parser.add_option("-c", "--config", action="store", dest="config_file",
                      default="test", type="string",
                      help="let prog load a specified configure file")
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      default=False, help="let prog run in verbose model")
    options, args = parser.parse_args()
    if options.verbose:
        print "run in verbose model"
    print "configure file is %s"%(options.config_file)

不要对他们进行文字评估。是什么让你认为你应该这样做呢?与其只捕获你的异常,不如让它打印出完整的错误,看看你的代码有什么问题。使用像“一”这样的直接引号,而不是像“一”这样的书中引号。斯威尼罗德明白了:我一去掉ast.literal\u eval并使用sys.argv[1],它就工作了。我正在编写一个示例(Python的新版本),以前使用过ast.literal_eval,所以认为我需要它。Thanks@user3144462没问题。因为wim在他们的回答中也提到了这一点,所以在某个时候最好接受这一点。不要
ast.literalval
。是什么让你认为你应该这样做呢?与其只捕获你的异常,不如让它打印出完整的错误,看看你的代码有什么问题。使用像“一”这样的直接引号,而不是像“一”这样的书中引号。斯威尼罗德明白了:我一去掉ast.literal\u eval并使用sys.argv[1],它就工作了。我正在编写一个示例(Python的新版本),以前使用过ast.literal_eval,所以认为我需要它。Thanks@user3144462没问题。因为wim在他们的回答中也提到了这一点,所以最好在某个时候接受这样一个事实:optpasse是不推荐的。optpasse是不推荐的