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/
HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command注册表路径可能会有所不同,使用python26.exe或者python.exe注册表中已有的.
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
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)
| 归档时间: |
|
| 查看次数: |
353246 次 |
| 最近记录: |