我有一个名为“gcc_opt.pyw”的 Python 脚本,并将其目录包含在 Windows PATH 环境变量中。
但是没有一个命令行参数传递给脚本。打印出 sys.argv 告诉我 argv 列表中只有文件名。
此命令:
gcc_opt HelloWorld.c -o HelloWorld.exe -shared
结果是
["C:\\Scripts\\gcc_opt.pyw"]
你能告诉我为什么没有其他论据吗?
我不知道这是否重要,但我已将 python.exe 设置为执行 .pyw 文件的默认程序,因为我没有看到使用 pythonw.exe 的任何打印(为什么会这样)。
您没有获取参数的原因是您破坏了 .py 关联,因此您可以双击这些文件在 NotePad++ 中打开它们,然后破坏 .pyw 关联来执行 .py 应该做的事情。
简而言之,您忘记%*在 Python.exe 命令行末尾包含“自定义”(混乱的).pyw 关联。
%*
ASSOC 和 FTYPE 命令用于显示关联和文件类型,即运行哪个程序来处理具有特定扩展名的文件。这些命令在我的系统上产生的结果如下:
C:\test>assoc .py .py=Python.File C:\test>assoc .pyw .pyw=Python.NoConFile C:\test>ftype python.file python.file="C:\Python27\python.exe" "%1" %* C:\test>ftype python.noconfile python.noconfile="C:\Python27\pythonw.exe" "%1" %*
正常的.py关联会使用控制台窗口运行python.exe,以便您可以看到打印语句的输出。
正常的.pyw 关联运行 pythonw.exe,没有控制台窗口。
您可以看到,在每个命令行的末尾都有一个%*。这就是将参数发送给命令的内容。(实际上,%1是第一个参数,%* 意思是“所有剩余的参数”。)
%1
当您尝试在命令行运行 python 文件而不输入其扩展名或初始“python”命令时,会发生一些事情。
首先使用 PATHEXT 环境变量来查找匹配的扩展名。对于您的情况,它会发现您的命令名称“gcc_opt”+ .PYW 会生成一个匹配的文件。
然后查找 .PYW 文件的关联,找到文件类型 Python.NoConFile,在您的情况下,该文件类型设置为“python.exe”(应该是 pythonw.exe)。(您可以在注册表中的 HKEY_CLASSES_ROOT 下看到这些。)
然后,系统根据该文件类型的命令模板创建一个实际的命令行,在你的情况下可能是
"[your-python-path]python.exe" "%1"
这告诉它只使用第一个参数,即你的 python 脚本名称“gcc_opt.pyw”。
快速解决方法是将其添加%*到该命令的末尾。
正确的解决方法是将事物恢复到正确的关联并通过更标准的方法打开 Python 文件进行编辑(将图标拖放到 NotePad 上,或者右键单击并使用 NotePad 编辑)。