Удаление файла в скрипт для запуска в качестве аргумента вызывает исключение в Vista - PullRequest
2 голосов
/ 07 сентября 2010

edit: ОК, я могу поклясться, что способ, которым я тестировал это, показал, что getcwd также вызывал исключение, но теперь кажется, что это просто создание файла. Когда я перемещаю блоки try-Кроме их, они действительно ловят это так, как вы думаете. Так что мелом до ошибки пользователя.
Оригинальный вопрос:
У меня есть скрипт, над которым я работаю, и я хочу, чтобы можно было добавить в него файл, чтобы он запускался с этим файлом в качестве аргумента. Я проверил этот вопрос , и у меня уже есть упомянутые ключи реестра (по-видимому, об этом позаботится установщик 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 (), скрипт не потерпит неудачу. Если я перемещу эту строку в блоке исключений, она никогда не будет выполнена.

Я предполагаю, что работает, сбросив на него файл, который, согласно другому связанному вопросу, использует WSH, каким-то образом портит его разрешения или cwd, но я не знаю, как обойти это.

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Как указывалось в моем редактировании выше, ошибки были вызваны изменением рабочего каталога на 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('\\')])
1 голос
/ 07 сентября 2010

Поскольку это, вероятно, связано не с Python, а с проблемой Windows (я, например, не смог воспроизвести ошибку, учитывая ваш код), я бы предложил подключить отладчик к интерпретатору Python при его запуске. Поскольку вы неявно запускаете интерпретатор с помощью действия перетаскивания, вам необходимо настроить Windows на автоматическое присоединение отладчика при каждом запуске Python. Если я правильно помню, эта статья содержит необходимую информацию для этого (вы можете заменить другой отладчик, если вы не используете Visual Studio).

Кроме того, я бы сделал снимок с ProcMon при перетаскивании файла в ваш скрипт, чтобы понять, что происходит.

...