在Vista中,将文件拖放到脚本作为参数运行时导致异常

2 投票
2 回答
1031 浏览
提问于 2025-04-16 03:49

编辑:好的,我可以发誓我之前测试的时候显示是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

看起来这个问题可能跟Python没关系,而是Windows的问题(就我个人而言,我无法根据你的代码重现这个错误)。我建议你在启动Python解释器时,给它连接一个调试工具。因为你是通过拖放的方式来启动解释器,所以需要设置Windows,让它在每次启动Python时自动连接调试工具。如果我没记错的话,这篇文章里有相关的信息可以帮助你做到这一点(如果你不使用Visual Studio,也可以换成其他的调试工具)。

除此之外,我建议你在拖动文件到你的脚本时,使用ProcMon来拍个快照,这样可以了解发生了什么情况。

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('\\')])

撰写回答