我有一个简单的脚本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文件的默认程序。
有什么问题?
答案 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/
HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
注册表路径可能会有所不同,请使用python26.exe
或python.exe
或注册管理机构中已有的。
答案 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.bat
和test-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已添加到环境变量中。