【问题标题】:Python Script, args not transferred to ScriptPython 脚本,args 未传输到脚本
【发布时间】:2011-11-23 17:22:33
【问题描述】:

我有一个名为“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 的打印(为什么会这样)。

【问题讨论】:

  • 尝试将目录切换到 gcc_opt 的目录并运行:python gcc_opt.pyw HelloWorld.c -o HelloWorld.exe -shared

标签: python cmd


【解决方案1】:

你应该把它重命名为 .py。

.pyw 旨在用于 GUI 应用程序,因为它们不需要控制台窗口。

【讨论】:

  • 但是我不希望它在我双击它时被执行,从命令行调用它时这不是必需的吗?我的意思是,当时执行的默认程序是 python.exe,但目前它是 notepad++.exe。 :)
  • @Niklas R:在 Windows 上,.py.pyw 扩展的默认打开(即双击)操作是分别使用 python.exepythonw.exe 运行脚本。要编辑脚本,您通常需要右键单击,然后从上下文菜单中选择 Edit with...(或先启动编辑器并从其中打开文件)。
【解决方案2】:

您没有获取参数的原因是因为您破坏了 .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是第一个参数,%* 表示“所有剩余参数”。)

当你尝试在命令行运行 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++ 编辑)。

【讨论】:

  • 哇,我印象深刻。 ^^ 感谢您的精彩解释。 +1,已接受。
  • 在 Windows 上(我怀疑任何使用二进制安装程序安装 Python 的平台),如果您想要快速修复,您可以运行安装程序并选择“修复”选项。当然,这取决于您一开始就安装了二进制安装程序,我意识到并非总是如此。
  • 这个答案帮助了我,但是:为什么python的第一个参数是"%1"而不是"%0"? CMD.EXE 中的替换行为是否与 .BAT 文件中的替换行为不同?
猜你喜欢
  • 2014-08-22
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2011-06-26
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多