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 的文档是错误的。assoc
和 ftype
与当前用户的当前文件关联无关。它们仅向您显示在“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)的主要内容,如果未能解决你的问题,请参考以下文章
具有 nargs 行为的 Python argparse 不正确