7

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

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

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

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

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

如您所见,它没有显示-h我提供给它的论点。

我的check.py

import sys
print "hello"
print sys.argv

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

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

我的目的是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']
4

3 回答 3

5

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

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

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

见 MSDN

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

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

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

python check.py %*

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

于 2012-04-23T13:47:03.193 回答
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"意思),其余参数是给脚本的参数(这就是什么%*意思)。%*我猜你的问题是由于适当的注册表项中缺少部分引起的。

于 2012-04-23T19:15:58.490 回答
0

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

@echo off
SET MYPATH=%~dp0
python3.exe %MYPATH%\myscript.py %*
于 2020-07-28T06:57:56.607 回答