如何在Windows中执行Python脚本?

时间:2009-12-20 02:09:25

标签: python windows scripting command-line file-association

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

import sys
print sys.argv[1]

如果我执行我的脚本:

python c:/..../blah.py argument

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

blah.py argument
发生

错误:

  

... IndexError

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

PATH中的

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

有什么问题?

10 个答案:

答案 0 :(得分:140)

当您在不在前面键入“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

键:

"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/

example registry setting for python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command注册表路径可能会有所不同,请使用python26.exepython.exe或注册管理机构中已有的。

enter image description here HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

答案 1 :(得分:22)

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

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

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

答案 2 :(得分: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:\>

答案 3 :(得分:4)

  

如何在Windows中执行Python脚本?

您可以安装pylauncher。它用于启动.py,.pyw,.pyc,.pyo文件并支持多个Python安装:

T\:> blah.py argument

如果在PATHEXT环境变量中有.py,.pyw,则可以运行Python脚本而不指定.py扩展名:

T:\> blah argument

如果您安装了多个版本,它会添加对shebang(#!标题行)的支持,以在Windows上选择所需的Python版本。您可以使用* nix兼容语法#! /usr/bin/env python

您可以明确指定版本,例如,使用最新安装的Python 3版本运行:

T:\> py -3 blah.py argument

它还应该将您的sys.argv问题视为副作用。

答案 4 :(得分:4)

我遇到了同样的问题,但是需要为Windows用户打包我的代码(来自Linux)。 我的包中包含许多带命令行选项的脚本。

我需要将这些脚本安装在Windows用户计算机上的适当位置,以便他们可以从命令行调用它们。 由于该软件包应该是用户友好的,因此要求我的用户更改其注册表以运行这些脚本是不可能的。

我遇到了一个解决方案,Continuum的人们使用他们的Anaconda软件包附带的Python脚本 - 请查看您的Anaconda / Scripts目录中的示例。

对于Python脚本test,请创建两个文件:test.battest-script.py

test.bat如下所示(.bat调用Anaconda\Scripts中的python.exe个文件,其中包含我根据自己的目的调整的相对路径):

@echo off
set PYFILE=%~f0
set PYFILE=%PYFILE:~0,-4%-script.py
"python.exe" "%PYFILE%" %*

test-script.py是您真正的Python脚本:

import sys
print sys.argv

如果将这两个文件保留在本地目录中,则可以通过.bat文件调用Python脚本

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

如果您将这两个文件复制到PATH上的位置(例如Anaconda\Scripts),那么您甚至可以通过省略.bat后缀

来调用您的脚本
test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

免责声明:我不知道发生了什么以及它是如何运作的,所以我们不胜感激。

答案 5 :(得分:2)

Windows 上,

运行python模块而不输入“python”

- >右键单击任何python(*。py)文件

- >将open with property设置为“python.exe”

- >检查“始终将此程序用于此文件类型”

- >将python.exe的路径附加到可变环境,例如附加 C:\ Python27到PATH环境变量。

运行python模块而不输入“.py”扩展名

- >编辑PATHEXT系统变量并将“.PY”扩展名附加到列表中。

答案 6 :(得分:1)

找到了一个非常有用的答案here如何在cmd中运行不同的python版本?

  

我建议使用Python Launcher for Windows实用程序,不久前将其引入Python 3.3。您也可以直接从作者的网站手动下载和安装它,以便与早期版本的Python 2和3一起使用。

     

无论您如何获得它,安装后它将与所有标准Python文件扩展名(即.py,.pyw,.pyc和.pyo文件)相关联。您不仅可以通过添加Linux / Unix-y shebang#!/ usr / bin / env pythonX注释来明确控制在命令提示符下使用的版本,还可以逐个脚本地控制。在Python脚本的开头。

正如J.F. Sebastian建议的那样,Python Launcher for Windows是在Windows中启动不同版本Python的最佳和默认选择。它曾经是第三方工具,但现在从Python 3.3开始正式支持。

  

版本3.3中的新功能。

     

Windows的Python启动器是一个实用程序,它可以帮助定位和执行不同的Python版本。它允许脚本(或命令行)指示特定Python版本的首选项,并将定位并执行该版本。

这是一个很好用的工具!

答案 7 :(得分:0)

你可以从任何地图执行python.exe吗? 如果你不这样做,请在PATH环境中找到适当的python.exe值

你和blah.py在同一个目录里吗?通过发出命令检查这一点 - >编辑blah.py并检查是否可以打开此文件

修改

在那种情况下你不能。 ( python arg 意味着你调用python.exe whit一些python假设你想要运行的脚本文件名的参数)

您可以在路径图中创建 bat文件白线,然后运行.bat文件

例:
在其中一个路径图中,创建 blah.py.bat 编辑文件并放置行

python C:\Somedir\blah.py

你现在可以从任何地方运行blah.py,因为你在运行bat文件时不需要放置.bat扩展

答案 8 :(得分:0)

如果这是我所了解的,就像这样:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

复制(不删除)python.exe并重命名为py.exe并执行:

py filename.py

答案 9 :(得分:0)

只需运行命令:

C:>python .\file_name.py

假设文件名位于同一文件夹中,并且Python已添加到环境变量中。