为啥直接调用 Python 脚本时 argparse 无法识别参数?

Posted

技术标签:

【中文标题】为啥直接调用 Python 脚本时 argparse 无法识别参数?【英文标题】:Why does argparse fail to recognise an argument when a Python script is called directly?为什么直接调用 Python 脚本时 argparse 无法识别参数? 【发布时间】:2016-07-29 12:52:47 【问题描述】:

我有一个像这样的简单脚本(基于the docs for argparse):

def Main():
    parser = argparse.ArgumentParser()
    parser.add_argument("issuenumber", help="Create a local branch based on the specified issue number", type=int)
    args = parser.parse_args()

    if args.issuenumber:
        print("Starting work on issue #"+str(args.issuenumber))

if __name__ == "__main__":
    Main()

但是,当我运行它时,它永远不会识别我传递给它的参数:

C:\Projects\PyTools>Gritter.py 1
usage: Gritter.py [-h] issuenumber
Gritter.py: error: the following arguments are required: issuenumber

如果我通过 python 调用脚本,它可以工作:

C:\Projects\PyTools>python Gritter.py 1
Starting work on issue #1

如果我打印出sys.argv,我会得到:

C:\Projects\PyTools>Gritter 1
['C:\\Projects\\PyTools\\Gritter.py']

C:\Projects\PyTools>Python Gritter.py 1
['Gritter.py', '1']

所以我猜当直接调用脚本时有些东西没有传递参数。不知道有没有什么办法可以直接调用脚本?

【问题讨论】:

可能重复:***.com/questions/31546331/… 它本身看起来像这个的副本:***.com/questions/2640971/… 【参考方案1】:

C\ 表示您使用的是 Windows。您需要付出额外的努力来确保这个“直接调用”将参数传递给python

查找 windows shebang 我发现,来自您需要使用的 Python 文档

#!/usr/bin/python -v

传递参数

见https://docs.python.org/3/using/windows.html

argparse 使用sys.argv。如果只有脚本名称,则调用未传递参数。

【讨论】:

我尝试添加#! /usr/bin/python,但这似乎无济于事。我还添加了 args 的打印输出,显示直接调用脚本似乎删除了额外的参数。【参考方案2】:

基于mckoss` answer,我修改了以下注册表项:

HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command

从这里:

"C:\Python34\python.exe" "%1"

到这里:

"C:\Python34\python.exe" "%1" %*

现在我的脚本可以正常工作了。

【讨论】:

以上是关于为啥直接调用 Python 脚本时 argparse 无法识别参数?的主要内容,如果未能解决你的问题,请参考以下文章

python argpare 模块的简单用法

python的argpare和click模块详解

从 python 脚本中提取参数

从 PHP 控制器使用 request.post() 调用 python 脚本永远不会返回。为啥?

pycharm编译python3为啥不能直接计算数学结果?

为啥Python调用方法,有的前面加类名,有的不加?