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

时间:2012-04-23 13:33:51

标签: python windows

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

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

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

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

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,它在我上面提到的两种情况下都可以正常工作,即打印“hello”就好了。

所以,我的问题是如何在将脚本添加到环境变量后执行接受一些命令行参数的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']

3 个答案:

答案 0 :(得分:5)

Windows没有可执行脚本文件的概念,解释器以#!的形式给出,因此您打算执行的操作无效。 Windows所做的是调用WinAPI函数ShellExecute,它执行以下操作:

  

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

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

see MSDN

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

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

为避免这种情况,您可以做的是创建名为.bat的小check.bat个文件:

python check.py %*

(有关详细信息,请参阅this SO question。如果无法找到check.py或python,您可能还必须提供绝对路径。

答案 1 :(得分: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"的含义),其余的参数是那些给予脚本(这就是%*)的意思。我猜您的问题是由于在适当的注册表项中缺少%*部分引起的。

答案 2 :(得分:0)

如果从PATH运行,则可能不想将脚本硬编码为python脚本。因此,如果将python脚本相对于bat文件放置,则可以使用类似以下内容的

@echo off
SET MYPATH=%~dp0
python3.exe %MYPATH%\myscript.py %*