【问题标题】:How to execute Python scripts in Windows?如何在 Windows 中执行 Python 脚本?
【发布时间】:2010-12-28 10:14:10
【问题描述】:

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

import sys
print sys.argv[1]

如果我通过以下方式执行我的脚本:

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

它打印参数,但如果我通过以下方式执行脚本:

blah.py argument

发生错误:

索引错误...

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

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

有什么问题?

【问题讨论】:

  • 发布一个sn-p代码可能会帮助我们帮助您。
  • 没有水晶球的人已经给出了解决方案=) print sys.argv[1] 产生这个错误。
  • 如果你安装了多个版本的 Python,你可能需要这个stackoverflow.com/questions/1934675/…
  • 手动告诉python从注册表运行我的脚本:"C:\Python27\python.exe" "C:\Python27\tpt.py" "%1"`

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


【解决方案1】:

只需运行命令:

C:>python .\file_name.py

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

【讨论】:

    【解决方案2】:

    当你执行一个脚本而不在前面输入“python”时,你需要知道关于 Windows 如何调用程序的两件事。首先是找出Windows认为它是什么类型的文件:

    C:\>关联.py .py=Python.文件

    接下来,您需要了解 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/

    HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command 注册表路径可能会有所不同,请使用 python26.exepython.exe 或注册表中已有的任何一个。

    HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

    【讨论】:

    • 即使assocftype 显示正确的信息,也可能会发生参数被剥离的情况。在这种情况下,可能有帮助的是直接修复 Python 的相关注册表项。将HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command 键设置为:"C:\Python26\python26.exe" "%1" %* 以前可能缺少%*。同样,将HKEY_CLASSES_ROOT\py_auto_file\shell\open\command 设置为相同的值。见eli.thegreenplace.net/2010/12/14/…
    • @parvus 您的评论是我的终极解决方案。即使关联读取正确,这两个键都设置不正确。
    • 我也遇到了将 HKEY_CLASSES_ROOT\.py\OpenWithProgids 设置为与 VisualStudio 相关的问题,特别是当我尝试在我的 AppVeyor 测试中运行 Python 脚本时。见help.appveyor.com/discussions/problems/…
    • 我有类似的问题。 Anaconda 默认添加了缺少 %* 的注册表项
    • 在 Win10 中我写 test.py 123 并且我得到 123 打印为 sys.argv[1]。微软改变了什么?
    【解决方案3】:

    Windows 上,

    在不输入“python”的情况下运行 python 模块

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

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

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

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

    在不输入“.py”扩展名的情况下运行 python 模块

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

    【讨论】:

      【解决方案4】:

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

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

      无论您如何获得它,安装后它都会与所有标准 Python 文件扩展名(即 .py、.pyw、.pyc 和 .pyo 文件)相关联。您不仅可以在命令提示符处显式控制使用哪个版本,还可以通过在Python 脚本的开头。

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

      3.3 版中的新功能。

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

      这是一个很棒的工具,只需使用它!

      【讨论】:

        【解决方案5】:

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

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

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

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

        test.bat 如下所示(Anaconda\Scripts 中的 .bat 文件调用 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']
        

        免责声明:我不知道发生了什么以及它是如何工作的,因此希望得到任何解释。

        【讨论】:

        • 为每个 Python 脚本创建一个 .bat 包装器既笨拙又多余。我不会推荐这个。
        【解决方案6】:

        如何在 Windows 中执行 Python 脚本?

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

        T\:> blah.py argument
        

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

        T:\> blah argument
        

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

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

        T:\> py -3 blah.py argument
        

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

        【讨论】:

        【解决方案7】:

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

        在 Windows 7 中:

        右键单击计算机
        左键单击属性
        左键单击高级系统设置
        左键单击“高级”选项卡
        左键单击环境变量...
        在“系统变量”下向下滚动,直到看到 PATHEXT
        左键单击 PATHEXT 以突出显示它
        左键单击编辑...
        编辑“变量值”,使其包含;.PY(End 键将跳到末尾)
        左键单击确定
        左键单击确定
        左键单击确定

        注意 #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:\>
        

        【讨论】:

          【解决方案8】:

          你可以从任何地图执行 python.exe 吗? 如果没有,请检查 PATH 环境中 python.exe 的值是否正确

          您是否与 blah.py 在同一目录中。通过发出命令来检查这个 -> 编辑 blah.py 并检查你是否可以打开这个文件

          编辑:

          在这种情况下你不能。 (python arg 意味着您调用 python.exe 时带有一些参数,python 假定这些参数是您要运行的脚本的文件名)

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

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

          python C:\Somedir\blah.py
          

          您现在可以从任何地方运行 blah.py,因为您在运行 bat 文件时不需要添加 .bat 扩展名

          【讨论】:

          • PATH 中的 python。并且包含 blah.py 的目录也在 PATH 中。主要思想是在不写入完整路径的情况下执行 python 脚本。但现在我在传递参数时遇到了问题。
          • Ralu,你不需要批处理文件来执行 python 脚本。使用 PATHEXT 环境变量将 .py 和 .pyw 作为可执行扩展名包含在内。这个 var 也是您不需要指定 .bat 的原因。
          【解决方案9】:

          您应该将处理 python 文件的默认应用程序设为 python.exe。

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

          那么您的 python 文件将始终使用 python.exe 运行

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-23
            • 1970-01-01
            • 1970-01-01
            • 2017-05-29
            • 2012-05-19
            • 2011-05-13
            相关资源
            最近更新 更多