将文件拖放到脚本上以作为参数运行会导致 Vista 出现异常

Posted

技术标签:

【中文标题】将文件拖放到脚本上以作为参数运行会导致 Vista 出现异常【英文标题】:Dropping a file onto a script to run as argument causes exception in Vista 【发布时间】:2011-04-09 09:12:23 【问题描述】:

编辑:好的,我可以发誓我测试它的方式表明 getcwd 也导致了异常,但现在看来它只是文件创建。当我将 try-except 块移动到它们时,它实际上确实会像您想象的那样捕获它。所以把它归结为用户错误。 原始问题: 我有一个正在处理的脚本,我希望能够在其上放置一个文件,让它以该文件作为参数运行。我签入了this question,并且我已经有了上面提到的注册表项(显然 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() 时,它会抛出异常,并且不执行任何来自除了:块,让我很难找到任何方法来实际让异常文本留在屏幕上。如果我取消注释 os.chdir(),脚本不会失败。如果我将该行移到 except 块内,它永远不会执行。

我猜测通过将文件放在上面来运行,根据另一个链接的问题,它使用 WSH,以某种方式弄乱了它的权限或 cwd,但我不知道如何解决它。

【问题讨论】:

有趣的问题。我同意这可能与 Windows 权限和隐含的工作目录有关。 问题是否只出现在这个文件夹上?您是否尝试过 chdir 到其他地方? 【参考方案1】:

鉴于这可能与 Python 无关,而是一个 Windows 问题(我无法根据您的代码重现该错误),我建议在 Python 解释器启动时将调试器附加到它。由于您通过拖放操作隐式启动解释器,因此您需要将 Windows 配置为在每次 Python 启动时自动附加调试器。如果我没记错的话,this 文章提供了执行此操作所需的信息(如果您不使用 Visual Studio,则可以替换另一个调试器)。

除此之外,我会在将文件拖到脚本上时使用ProcMon 拍摄快照,以了解发生了什么。

【讨论】:

【参考方案2】:

正如我在上面的编辑中指出的,错误是由工作目录更改为 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('\\')])

【讨论】:

以上是关于将文件拖放到脚本上以作为参数运行会导致 Vista 出现异常的主要内容,如果未能解决你的问题,请参考以下文章

将 iOS UIAutomation 作为操作后构建脚本运行会作为 posix spawn 错误返回

如何在 OS X 上拖放到 (python) 脚本上?

Bash 脚本:识别拖放到 konsole 的路径

将文件拖到窗体上以打开文件

将文件拖放到 NSTableView 上?

WPF:将文件拖放到整个窗口中(包括标题栏和窗口边框)