在Vista中,将文件拖放到脚本作为参数运行时导致异常
编辑:好的,我可以发誓我之前测试的时候显示是getcwd也导致了异常,但现在看来只是文件创建的问题。当我把try-except块放到它们的地方时,确实能像你想的那样捕捉到异常。所以这算是我的错误。
原问题:
我正在写一个脚本,想要实现拖放文件到它上面,然后用这个文件作为参数运行。我查看了这个问题,我已经有了提到的注册表键(显然Python 2.6的安装程序会处理这些)。但是,它抛出了一个我无法捕捉到的异常。从控制台运行时一切正常,但当我把文件拖到上面时,它抛出异常然后关闭了控制台窗口。我试着把标准错误重定向到一个文件,但在脚本中重定向发生之前就抛出了异常。经过一些测试,我快速发现当我尝试创建写入错误的文件时,它抛出了一个IOError。
import sys
import os
#os.chdir("C:/Python26/Projects/arguments")
try:
print sys.argv
raw_input()
os.getcwd()
except Exception,e:
print sys.argv + '\n'
print e
f = open("./myfile.txt", "w")
如果我从控制台运行这个脚本,无论有没有参数,它的表现都是正常的。如果我通过拖放一个文件,比如test.txt,来运行它,它会运行,正确打印参数,但在调用os.getcwd()时抛出异常,并且没有执行except:块中的任何内容,这让我很难找到办法让异常信息停留在屏幕上。如果我取消注释os.chdir(),脚本就不会失败。如果我把那行代码放到except块里,它就永远不会被执行。
我猜测通过拖放文件来运行它,根据其他链接的问题,这使用了WSH,可能在某种程度上搞乱了它的权限或当前工作目录,但我不知道该如何解决这个问题。
2 个回答
1
正如我在上面的编辑中提到的,错误是因为工作目录变成了 C:\windows\system32,这里不允许脚本创建文件。我不知道怎么才能让它在启动时不改变工作目录,但我找到了一种解决办法。
if len(sys.argv) == 1:
files = [filename for filename in os.listdir(os.getcwd())
if filename.endswith(".txt")]
else:
files = [filename for filename in sys.argv[1:]]
我想修复工作目录可以这样处理。
exepath = sys.argv[0]
os.chdir(exepath[:exepath.rfind('\\')])