编辑:好的,我可以发誓,我测试它的方式显示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,但我不知道如何解决它。
答案 0 :(得分:1)
因为这可能与Python无关,但是Windows问题(我无法重现给定代码的错误),我建议在启动时将调试器附加到Python解释器。由于您通过拖放操作隐式启动解释器,因此您需要将Windows配置为每次Python启动时自动附加调试器。如果我没记错的话,this文章有必要的信息(如果你没有使用Visual Studio,你可以替换另一个调试器)。
除此之外,我会在将文件拖到您的脚本上时使用ProcMon创建快照,以了解正在发生的事情。
答案 1 :(得分: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('\\')])