Python脚本,参数未传递到脚本
我有一个叫做 "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时看不到任何输出(不管是什么原因)。
2 个回答
你应该把它改名为 .py。
.pyw 是用来做图形用户界面(GUI)应用的,因为这些应用不需要控制台窗口。
你没有获取参数的原因是因为你破坏了 .py 文件的关联,这样你就可以双击这些文件用 NotePad++ 打开,但同时也破坏了 .pyw 文件的关联,导致它无法正常工作。
简单来说,你忘记在你的 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
是第一个参数,而 %*
意思是“所有剩下的参数”。)
当你在命令行中尝试运行一个 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++ 编辑)。