2011-09-23 64 views
3

我有一个名为“gcc_opt.pyw”的Python脚本,我将它的目录包含到Windows PATH环境变量中。Python脚本,参数没有转移到脚本

但是没有一个命令行参数被传递给脚本。打印sys.argv告诉我只有argv-list中的文件名。

此命令:

gcc_opt HelloWorld.c -o HelloWorld.exe -shared 

结果

["C:\\Scripts\\gcc_opt.pyw"] 

你能告诉我,为什么没有其他的参数呢?

我不知道它是否重要,但我已经将python.exe设置为执行.pyw文件的默认程序,因为我没有看到使用pythonw.exe的任何打印(为什么这是) 。

+0

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

回答

5

您无法获取参数的原因是因为您打破了.py 关联,因此您可以双击这些文件以在NotePad ++, 中打开它们,随后打破.pyw关联来执行.py应该做的。

简而言之,您忘记在您的“自定义”(损坏).pyw关联的Python.exe命令 行的末尾包含%*

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文件而无需键入其 扩展或最初的“蟒蛇”命令,几件事情发生。

首先使用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 ++编辑)。

+0

哇,我印象深刻。 ^^感谢这个令人敬畏的解释。 +1,已接受。 –

+1

乐意帮忙。 =) – Todd

+0

在Windows上(我怀疑你使用二进制安装程序安装了Python的任何平台),如果你想快速修复,你可以运行安装程序并选择'修复'选项。当然,这取决于你是否已经安装了二进制安装程序,我认识并不总是如此。 – mdscruggs

2

您应该将其重命名为.py。

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

+1

但我不希望在双击它时执行它,而不是这样从命令行调用它时需要吗?我的意思是,执行的默认程序是python.exe,但目前它是notepad ++。exe。 :) –

+1

@Niklas R:在Windows上,'.py'和'.pyw'扩展名的缺省开放(即双击)动作是分别用'python.exe'或'pythonw.exe'运行脚本。要编辑脚本,通常需要右键单击,然后从上下文菜单中选择“Edit with ...”(或先启动编辑器并从其中打开文件)。 – martineau