Python argparse 行为因启动模式而异(Windows)

Posted

技术标签:

【中文标题】Python argparse 行为因启动模式而异(Windows)【英文标题】:Python argparse behavior differs depending on launch mode (Windows) 【发布时间】:2018-09-06 00:13:10 【问题描述】:

这是我的 test-argparse.py 软件的摘录:

from __future__ import print_function
import argparse
import sys

def manage_command_line():
    parser = argparse.ArgumentParser(description='Simple Description')
    parser.add_argument('code', type=str, help='Project code')
    return parser.parse_args()

args = manage_command_line()
print(args)
print(sys.version)

当作为解释器的参数调用时(结果正确且符合预期):

c:\Python27\python.exe test-argparse.py KB130
Namespace(code='KB130')
2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)]

但是如果直接调用,依赖windows文件关联,结果就完全不一样了:

C:\Users\PGO\Documents\docauto>test-argparse.py KB130
usage: test-argparse.py [-h] code
test-argparse.py: error: too few arguments

Windows 文件组关联和重定向的定义是标准的,如 Python 2.7.14 手册(第 3.3.4 章)所述:

C:\Users\PGO\Documents\docauto>assoc .py
.py=Python.File

C:\Users\PGO\Documents\docauto>ftype Python.File
Python.File="C:\Python27\python.exe" "%1" %*

C:\Users\PGO\Documents\docauto>

并且与我的系统路径一致,虽然我的 Python 版本是 2.7.12 而不是 2.7.14,这可能根本没有区别。

问题:有没有办法在两种情况下获得一致的结果?我希望应用程序的行为保持一致,而不受其执行方式的影响。

【问题讨论】:

希望我能提供更多帮助,但它在 Windows 10 上的 Python 3.6.4 和 Python 2.7.14 都按预期执行。 2.7.12/2.7.14 的区别无关紧要,无需考虑。 Python 2 的文档是错误的。 assocftype 与当前用户的当前文件关联无关。它们仅向您显示在“HKLM\Software\Classes”中定义的系统 .py 关联和 Python.File 程序标识符。每个用户的“HKCU\Software\Classes”定义具有优先级并且可能不同,此外,Explorer 缓存和存储关联以及用户在“HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts”下的锁定选择。 @eryksun 您的建议是准确的,这种情况显然在我的机器上造成了问题,因为 HKCU\Software\Classes 指向不同的(Python 3)实例。我仍然必须正确测试它,但这可以回答我正在经历的影响。但是,当您发表评论而不是回答时,我无法提高您的声誉。 【参考方案1】:

这是我得到的:

C:\Users>ftype Python.File

Python.File="C:\Windows\py.exe" "%L" %*

这两种情况都适合我。我有 Python 3.6,可以解释可执行文件名称的差异。

【讨论】:

我也有同样的经历。似乎 OP 的 Python 文件关联配置错误。

以上是关于Python argparse 行为因启动模式而异(Windows)的主要内容,如果未能解决你的问题,请参考以下文章

页面之间的 PHP 会话丢失 - 行为因服务器而异

具有 nargs 行为的 Python argparse 不正确

Android - ImageView 方向因设备而异

为啥在 Tkinter 中计算的字符串的像素宽度和高度因平台而异?

线性回归预测因输入类型而异

使用来自另一个脚本的参数启动 python 脚本,以编程方式设置 argparse 值