将参数从cmd传递到python脚本[重复]

Posted

技术标签:

【中文标题】将参数从cmd传递到python脚本[重复]【英文标题】:Pass arguments from cmd to python script [duplicate] 【发布时间】:2013-05-18 17:54:22 【问题描述】:

我在 python 中编写脚本并通过输入以下命令使用 cmd 运行它们:

C:\> python script.py

我的一些脚本包含基于标志调用的单独算法和方法。 现在我想直接通过 cmd 传递标志,而不是在运行之前进入脚本并更改标志,我想要类似于:

C:\> python script.py -algorithm=2

我读到人们将 sys.argv 用于几乎类似的目的,但是阅读手册和论坛我无法理解它是如何工作的。

【问题讨论】:

您检查过argparse 模块吗?它的文档非常清晰,应该可以帮助您入门。 @PierreGM 我以前没见过,这是否意味着我可以在我的脚本中添加parser = argparse.ArgumentParser()parser.add_argument(('--Algorithm")args = parser.parse_args() 然后在cmd 中输入C:\> python script.py --Algorithm=2 这样算法设置为 2,python 脚本将运行与算法 2 相关的任务? 【参考方案1】:

有一些专门用于解析命令行参数的模块:getoptoptparseargparseoptparse 已弃用,getopt 不如argparse 强大,所以我建议你使用后者,从长远来看它会更有帮助。

这是一个简短的例子:

import argparse

# Define the parser
parser = argparse.ArgumentParser(description='Short sample app')

# Declare an argument (`--algo`), saying that the 
# corresponding value should be stored in the `algo` 
# field, and using a default value if the argument 
# isn't given
parser.add_argument('--algo', action="store", dest='algo', default=0)

# Now, parse the command line arguments and store the 
# values in the `args` variable
args = parser.parse_args()

# Individual arguments can be accessed as attributes...
print args.algo

这应该让你开始。在最坏的情况下,网上有大量可用的文档(例如,this one)......

【讨论】:

如果我写了一个语言解释器,我将如何处理输入文件路径 lang file.lang 例如...【参考方案2】:

它可能无法回答你的问题,但有些人可能会觉得它很有用(我在这里寻找这个):

如何将 2 个 args (arg1 + arg2) 从 cmd 发送到 python 3:

----- 发送 test.cmd 中的参数:

python "C:\Users\test.pyw" "arg1" "arg2"

----- 检索 test.py 中的参数:

print ("This is the name of the script= ", sys.argv[0])
print("Number of arguments= ", len(sys.argv))
print("all args= ", str(sys.argv))
print("arg1= ", sys.argv[1])
print("arg2= ", sys.argv[2])

【讨论】:

【参考方案3】:

尝试使用getopt 模块。它可以处理短命令行选项和长命令行选项,并且在其他语言(C、shell 脚本等)中以类似的方式实现:

import sys, getopt


def main(argv):

    # default algorithm:
    algorithm = 1

    # parse command line options:
    try:
       opts, args = getopt.getopt(argv,"a:",["algorithm="])
    except getopt.GetoptError:
       <print usage>
       sys.exit(2)

    for opt, arg in opts:
       if opt in ("-a", "--algorithm"):
          # use alternative algorithm:
          algorithm = arg

    print "Using algorithm: ", algorithm

    # Positional command line arguments (i.e. non optional ones) are
    # still available via 'args':
    print "Positional args: ", args

if __name__ == "__main__":
   main(sys.argv[1:])

然后您可以使用-a--algorithm= 选项指定不同的算法:

python <scriptname> -a2               # use algorithm 2
python <scriptname> --algorithm=2    # ditto

见:getopt documentation

【讨论】:

感谢您的回答,几个简单的问题,1.if __name__ == "__main__": 的职责是什么? 2. 这是一个定义,所以我可以或应该将其保存在单独的 python 脚本中,然后通过from xxx import *if __name__ == "__main__": main(sys.argv[1:]) 调用我的实际脚本? @Kevin Bell,如果脚本从命令行运行,而不是在 python 解释器或其他脚本中导入,__name__ == "__main__" 的测试将返回 true。设计取决于您 - 如果您的程序是自包含在该单个脚本中的,那么您只需添加 __name__ == "__main__" 测试以允许从命令行启动它。否则,如果您导入脚本,则必须将 argv 参数传递给 main() 调用。 我遇到了问题,不知道为什么,但还是谢谢。我得到了 Pierre GM 建议的我想要的东西。万事如意

以上是关于将参数从cmd传递到python脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将参数从Javascript传递到flask python脚本[重复]

将参数从 CMD 文件传递​​到 SQL 脚本

如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

Python和Java参数传递[重复]

如何将数组从 C 传递到嵌入式 python 脚本

如何将参数从命令行传递到 python 脚本以读取和更新 json 文件中存在的某些键的值