Python脚本,参数未传递到脚本

3 投票
2 回答
645 浏览
提问于 2025-04-17 02:56

我有一个叫做 "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 个回答

2

你应该把它改名为 .py。

.pyw 是用来做图形用户界面(GUI)应用的,因为这些应用不需要控制台窗口。

5

你没有获取参数的原因是因为你破坏了 .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++ 编辑)。

撰写回答