从Windows上的PATH运行时,Python脚本丢失参数

我知道我的标题不是描述性的,所以让我试着在这里解释一下。

通常我执行我的Python脚本是这样的:

D:\github\Miscellaneous-Programs\Python>python check.py -h hello ['check.py', '-h'] 

现在我所做的是在我的Windows path环境variables中添加文件夹D:\github\Miscellaneous-Programs\Python 。 比我试图执行我的脚本是这样的:

 C:\Users\noob>check -h hello ['D:\\github\\Miscellaneous-Programs\\Python\\check.py'] 

正如你所看到的,它没有显示我提供给它的-h参数。

我的check.py

 import sys print "hello" print sys.argv 

如果我从上面提到的Python脚本中删除print sys.argv ,它在我上面提到的两种情况下工作正常,即它打印“你好”就好。

所以,我的问题是,如何在脚本添加到环境variables后执行一个接受一些命令行参数的python脚本。

我的目的是在Windows命令提示符下执行我的python script ,它有点类似于chmod +x check.py

我尝试了cygwin中的chmod选项,对于这两种情况都可以正常工作。

Cygwin output

 noob@noob-PC ~ $ chmod +x check.py noob@noob-PC ~ $ ./check.py h ['./check.py', 'h'] 

Solutions Collecting From Web of "从Windows上的PATH运行时,Python脚本丢失参数"

Windows没有一个可执行的脚本文件的概念与解释器给出#! ,所以你打算做什么不能工作。 Windows所做的是调用WinAPI函数ShellExecute执行以下操作:

但是,它更常用于启动在特定文件上运行的应用程序。 例如,.txt文件可以通过Microsoft写字板打开。 .txt文件的开放式动词因此将对应于类似以下命令的内容:

 "C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1" 

请参阅MSDN

正如你所看到的,只有第一个参数被提供给应用程序。 在你的情况下,这转化为以下内容:

 "C:\Program Files\Python\Python.exe" "D:\github\Miscellaneous-Programs\Python\check.py" 

你可以做什么来避免这种情况是创建一个名为check.bat .bat文件。

 python check.py %* 

(有关更多详细信息,请参见此问题。如果找不到check.py或python,则可能还需要提供绝对路径)

将文件夹放在PATH上不会影响系统在命令行通过编写script.py -h运行脚本时的行为方式。 系统会读取注册表以了解如何运行您提供的命令。 您可以通过先运行reg query HKCR\.py /ve然后取得结果(通常是Python.File )并运行reg query HKCR\Python.File\shell\open\command /ve 。 我的系统上的输出是"C:\Program Files\Python Launcher (64-bit)\py.exe" "%1" %* 。 这意味着当系统看到script.py -h命令时,它运行py.exe程序,第一个参数是脚本的名字(这就是"%1"意思),其余的参数是给予脚本(这就是%* )的意思。 我想你的问题是由于在适当的注册表项中缺少%*部分引起的。