如何在Windows中执行Python脚本?

ton*_*4eg 92 python windows scripting command-line file-association

我有一个简单的脚本blah.py(使用Python 2):

import sys
print sys.argv[1]
Run Code Online (Sandbox Code Playgroud)

如果我执行我的脚本:

python c:/..../blah.py argument
Run Code Online (Sandbox Code Playgroud)

它打印参数,但如果我执行脚本:

blah.py argument
Run Code Online (Sandbox Code Playgroud)

发生错误:

IndexError ...

所以参数不会传递给脚本.

PATH中的python.exe.blah.py的文件夹也在PATH中.
python.exe是执行*.py文件的默认程序.

问题是什么?

Pet*_*sen 142

当您在不在前面键入"python"的情况下执行脚本时,您需要了解有关Windows如何调用该程序的两个方面.首先是找出Windows认为的文件类型:

    C:\>assoc .py
    .py=Python.File

接下来,您需要了解Windows如何使用该扩展程序执行操作.它与文件类型"Python.File"相关联,因此该命令显示了它将要执行的操作:

    C:\>ftype Python.File
    Python.File="c:\python26\python.exe" "%1" %*

所以在我的机器上,当我键入"blah.py foo"时,它会执行这个确切的命令,结果与我自己输入完整的东西没有区别:

    "c:\python26\python.exe" "blah.py" foo

如果你键入相同的东西,包括引号,那么你得到的结果与你输入"blah.py foo"时相同.现在,您可以自己找出问题的其余部分.

(或者在您的问题中发布更多有用的信息,例如您在控制台中看到的实际剪切和粘贴副本.请注意,执行此类操作的人会将他们的问题投票,并获得声望点,以及更多人可能会帮助他们找到好的答案.)

来自评论:

即使assoc和ftype显示正确的信息,也可能会发生参数被剥离的情况.在这种情况下可能有用的是直接修复Python的相关注册表项.设置

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command
Run Code Online (Sandbox Code Playgroud)

关键:

"C:\Python26\python26.exe" "%1" %*
Run Code Online (Sandbox Code Playgroud)

可能以前%*缺少了.同样,设置

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
Run Code Online (Sandbox Code Playgroud)

达到相同的价值.见http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

python.exe的示例注册表设置 HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command注册表路径可能会有所不同,使用python26.exe或者python.exe注册表中已有的.

在此输入图像描述 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

  • 即使`assoc`和`ftype`显示正确的信息,也可能发生参数被剥离的情况.在这种情况下可能有用的是直接修复Python的相关注册表项.将`HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command`键设置为:`"C:\ Python26\python26.exe""%1"%*`可能以前,`%*`丢失了.同样,将`HKEY_CLASSES_ROOT\py_auto_file\shell\open\command`设置为相同的值.见http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/ (30认同)
  • @parvus您的评论对我来说是最终的解决方案.即使关联读取正确,这两个键都设置不正确. (5认同)

san*_*osc 22

你应该使默认的应用程序处理python文件是python.exe.

右键单击*.py文件,选择"打开方式"对话框.在那里选择"python.exe"并检查"总是将此程序用于此文件类型"(类似的东西).

然后你的python文件将始终使用python.exe运行


Dav*_*ton 15

此外,如果您希望能够在不键入文件名末尾的.py(或.pyw)的情况下运行python脚本,则需要将.PY(或.PY;.PYW)添加到PATHEXT环境变量的扩展列表中.

在Windows 7中:

右键点击计算机
鼠标左键单击属性
左键单击高级系统设置
左键点击高级选项卡
左键单击环境变量......
在"系统变量",直到你看到PATHEXT向下滚动
鼠标左键点击PATHEXT以突出它
的左单击编辑...
编辑"变量值"使其包含;.PY (结束键将跳到结尾)
左键单击确定
左键单击确定
左键单击确定

注意#1:命令提示符窗口不会看到关闭和重新打开的更改.

注意#2:.py.pyw扩展之间的区别在于前者在运行时打开命令提示符,而后者则不会.

在我的计算机上,我添加;.PY;.PYW了最后一个(最低优先级)扩展,因此PATHEXT的"之前"和"之后"值为:

之前: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

以下是一些有益的命令:

C:\>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\>assoc .py
.py=Python.File

C:\>ftype Python.File
Python.File="C:\Python32\python.exe" "%1" %*

C:\>assoc .pyw
.pyw=Python.NoConFile

C:\>ftype Python.NoConFile
Python.NoConFile="C:\Python32\pythonw.exe" "%1" %*

C:\>type c:\windows\helloworld.py
print("Hello, world!")  # always use a comma for direct address

C:\>helloworld
Hello, world!

C:\>
Run Code Online (Sandbox Code Playgroud)