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

Ran*_*Rag 7 python windows

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

通常我会像这样执行我的python脚本:

D:\github\Miscellaneous-Programs\Python>python check.py -h
hello
['check.py', '-h']
Run Code Online (Sandbox Code Playgroud)

现在我做的是D:\github\Miscellaneous-Programs\Python在我的windows path环境变量中添加文件夹.比我试图像这样执行我的脚本:

C:\Users\noob>check -h
hello
['D:\\github\\Miscellaneous-Programs\\Python\\check.py']
Run Code Online (Sandbox Code Playgroud)

如你所见,它没有显示-h我提供给它的论据.

我的 check.py

import sys
print "hello"
print sys.argv
Run Code Online (Sandbox Code Playgroud)

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

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

我的目的是python script在Windows命令提示符中的任何地方执行我,这有点类似于chmod +x check.py.

chmod在cygwin中尝试了这个选项,它适用于两种情况.

Cygwin output

noob@noob-PC ~
$ chmod +x check.py

noob@noob-PC ~
$ ./check.py h
['./check.py', 'h']
Run Code Online (Sandbox Code Playgroud)

men*_*nsi 5

Windows没有可执行脚本文件的概念,并且解释器被指定为a #!,因此您打算执行的操作无效.Windows所做的是调用WinAPI函数ShellExecute,该函数执行以下操作:

但是,它更常用于启动对特定文件进行操作的应用程序.例如,.txt文件可以由Microsoft WordPad打开.因此,.txt文件的开放动词将对应于以下命令:

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
Run Code Online (Sandbox Code Playgroud)

见MSDN

如您所见,只有第一个参数提供给应用程序.在您的情况下,这转换为以下内容:

"C:\Program Files\Python\Python.exe" "D:\github\Miscellaneous-Programs\Python\check.py"
Run Code Online (Sandbox Code Playgroud)

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

python check.py %*
Run Code Online (Sandbox Code Playgroud)

(有关更多详细信息,请参阅此SO问题.如果无法找到check.py或python,您可能还必须提供绝对路径)


Pio*_*ost 5

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"是),其余参数是赋予脚本的参数(即是%*)。我想您的问题是由于缺少%*适当的注册表项引起的。