【问题标题】:Python script losing arguments when run from PATH on Windows在 Windows 上从 PATH 运行时 Python 脚本丢失参数
【发布时间】:2012-05-04 03:02:22
【问题描述】:

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

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

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

现在我所做的是在我的 Windows path 环境变量中添加文件夹 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,它在我上面提到的两种情况下都可以正常工作,即它打印“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']

【问题讨论】:

  • 制作一个包含python full\path\to\check.py 的.bat 文件并将包含该.bat 的目录添加到Path(您可能希望将echo off 放在.bat 的开头。
  • 我建议将标题更改为更具描述性的内容,例如。 “从 PATH 运行 Python 脚本会删除除第一个命令行参数之外的所有参数”,因此遇到相同问题的其他人会找到它。
  • 真的是C:\Users\noob>check -h 而不是C:\Users\noob>check.py -h

标签: python windows


【解决方案1】:

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

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

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

see MSDN

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

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

您可以做的就是创建一个名为check.bat 的小.bat 文件:

python check.py %*

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

【讨论】:

  • 感谢您的回复,它按照您的建议工作。我会接受您的回答,只是等待其他一些替代建议:D。
  • Windows 没有可执行脚本文件的概念,解释器以 #! 形式给出,所以你打算做的事情无法工作 Windows 没有shebang 确实,但这并不意味着您不能通过在命令行上给出它们的名称来运行各种脚本。顺便说一句,有一个很好的工具可以让 shebang 在 Windows 中工作 - Python Launcher
  • ShellExecute是系统在执行script.py -h等命令的过程中使用的WinAPI函数,不知道系统是如何使用这个函数的,你无法描述整个过程。你的答案是错误的。
【解决方案2】:

将文件夹放在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" 的意思),其余参数是给脚本的参数(即%*) 是什么意思。我猜你的问题是由于在适当的注册表项中缺少%* 部分造成的。

【讨论】:

  • 我对@9​​87654332@ 的输出:(Default) REG_SZ "C:\Python26\python.exe" "%1" %*。所以。不缺%*
  • 这对我很有帮助。
  • 直到最近我才遇到这个问题,但我最近在一台包含 Python Launcher 的新计算机上安装了 Python 3.4,现在感谢这个答案,发现 .py 文件的注册表项(显然是使用文件类py_auto_file)由于某种原因被添加而没有%*
  • 这是正确答案;我发现它对于让 Anaconda Python 在 Windows 上运行很有用。使用在管理员模式下运行的注册表编辑器 (regedit.exe) 进行所有这些更改可能会更容易。
  • 我一直在寻找解决这个问题的方法。一切看起来都应该如此,但它拒绝工作。没有 py_auto_file,我得到了 %* -> reg query HKCR\.py /ve ... Python ->reg query HKCR\Python\shell\open\command /ve ...\python.exe" "%1 " "%*"
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2011-12-13
    • 2019-09-11
    • 2016-03-10
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多