argparse:“sys.argv[1]”和“args.input”有啥区别?

Posted

技术标签:

【中文标题】argparse:“sys.argv[1]”和“args.input”有啥区别?【英文标题】:Argparse: what is the difference between "sys.argv[1]" and "args.input"?argparse:“sys.argv[1]”和“args.input”有什么区别? 【发布时间】:2018-06-24 23:32:42 【问题描述】:

我正在学习如何使用 argparse,这对我来说是一个迷宫。

我有一个有效的代码:如果我运行 python Test.py .,它会使用此代码打印层次结构中的所有文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import argparse
import sys
import glob

#parser = argparse.ArgumentParser()                             
#parser.add_argument('-input', dest='input',help="input one or more files",nargs='+',metavar=None                           
#args = parser.parse_args()

def dirlist(path, c = 1):

        for i in glob.glob(os.path.join(path, "*")):
                if os.path.isfile(i):
                        filepath, filename = os.path.split(i)
                        print ('----' *c + filename)

                elif os.path.isdir(i):
                        dirname = os.path.basename(i)
                        print ('----' *c + dirname)
                        c+=1
                        dirlist(i,c)
                        c-=1


#path = os.path.normpath(args.input)
path = os.path.normpath(sys.argv[1])
print(os.path.basename(path))
dirlist(path)

但是,由于我想了解 argparse 的工作原理,我想使用 python Test.py - input . 运行代码

但没有任何效果。

我知道我很接近了,我已经写了一种科学怪人的代码,它被注释了。

我哪里错了?我觉得我离解决方案很近了......

【问题讨论】:

请将文本作为文本发布,而不是截图 我不知道这条评论是否对你有帮助,但如果你想了解 argparse 是如何工作的,你可以随时look at source code。 args.input 将是一个列表,因为nargs='+'sys.argv[1] 将是一个字符串,我相信。 @FrancescoMantovani 如果可以,我会的。 我不知道为什么有人会发布一段纯文本作为截图。如果您的计算机上有一段文本,则将其作为文本粘贴到您的问题中(必要时在 <pre> 块中)应该比截屏更省力。如果您的程序输出对您的问题很重要(我认为这是因为您已经包含了它),为什么要防止(例如)本网站上的盲人能够阅读它? 【参考方案1】:

感谢@match 提供正确的提示。 问题是我在 argparse 定义中使用了nargs='+'

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import argparse
import sys
import glob

parser = argparse.ArgumentParser()                              
parser.add_argument('-input', dest='input',help="input one or more files",metavar=None)                     
args = parser.parse_args()

def dirlist(path, c = 1):

        for i in glob.glob(os.path.join(path, "*")):
                if os.path.isfile(i):
                        filepath, filename = os.path.split(i)
                        print ('----' *c + filename)

                elif os.path.isdir(i):
                        dirname = os.path.basename(i)
                        print ('----' *c + dirname)
                        c+=1
                        dirlist(i,c)
                        c-=1


path = os.path.normpath(args.input)
print(os.path.basename(path))
dirlist(path)

代码现在可以工作了!

【讨论】:

以上是关于argparse:“sys.argv[1]”和“args.input”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

将 optparse 转换为 argparse

如何在 pytest 中使用 sys.argv 为函数创建多个测试

Python笔记:命令行参数解析

读取命名命令参数

是否可以在没有任何标志的情况下使用 argparse?

python sys.argv