Python выдает ошибку, несмотря на то, что код работает правильно

У меня есть код на Python следующим образом:

folderPath = 'C:\Program Files (x86)\Program\folder/' + folderName
if not os.path.exists(folderPath):
    shutil.copytree('C:\Program Files (x86)\Program\folder\anotherfolder', folderPath)

Переменная имя_папки получена из пользовательского ввода, по сути, моя программа позволяет пользователю создать папку, а затем некоторое содержимое из другой папки копируется в новую папку. Вы можете думать об этом как о своего рода системе резервного копирования файлов.

Достаточно странно вот что. Он работает отлично, папка создается (как указано в документации Shutil), а содержимое другой папки копируется, НО возникает ошибка:

[error] script [ myScript ] stopped with error in line 52
[error] shutil.Error ( ['C:\\Program Files (x86)\\Program\\folder\\anotherfolder', 'C:\\Program 
Files (x86)\\Program\\folder\\test', "[Errno 5] Input/output error: 'C:\\\\Program Files 
(x86)\\\\Program\\\\folder\\\\test'"] )

В этом случае имя папки, которое я ввел, было «тест». Строка 52 — это вызов Shutil.copytree().

Затем мой скрипт перестает работать, хотя все файлы были скопированы, и все работало хорошо.

Как мне игнорировать это (если возможно) и продолжить работу со сценарием? Или как мне это исправить, если это действительно может быть проблема с моим кодом?

Вся помощь приветствуется.

Заранее спасибо.


person user3201185    schedule 29.01.2014    source источник
comment
Вы можете предоставить полную трассировку? Или, по крайней мере, покажите строку 52 (вероятно, это просто вызов Shutil.copytree)...   -  person Xeun    schedule 29.01.2014
comment
Это полная ошибка, которую я получил. Строка 52 — это вызов Shutil.copytree.   -  person user3201185    schedule 29.01.2014
comment
У вас есть косая черта в пути в первой строке. Это не может быть хорошо.   -  person Lennart Regebro    schedule 29.01.2014
comment
@LennartRegebro Что-то в Python, модуле os или Windows достаточно умно, чтобы справиться с этим.   -  person poke    schedule 29.01.2014
comment
Я не на компьютере с Windows, но можете ли вы сказать нам вывод import errno; print errno.errorcode[5]   -  person mgilson    schedule 29.01.2014
comment
@LennartRegebro: Говоря об этом, я пытался использовать \\ и /, тот же результат. Если я использую одну обратную косую черту, я получаю синтаксическую ошибку.   -  person user3201185    schedule 29.01.2014
comment
@mgilson: я получаю «EIO».   -  person user3201185    schedule 29.01.2014
comment
Этот вопрос имеет что-то похожее на вашу проблему.   -  person Laur Ivan    schedule 29.01.2014
comment
@user3201185 user3201185 -- Что ж, попробовать стоило. это не особенно полезно (это просто означает ошибку ввода-вывода).   -  person mgilson    schedule 29.01.2014
comment
@user3201185 user3201185 Это потому, что одинарная обратная косая черта — это escape-код. Вероятно, вам следует использовать двойную обратную косую черту. Добро пожаловать в Windows.   -  person Lennart Regebro    schedule 29.01.2014
comment
@LaurIvan: я только что попробовал, возникает та же ошибка.   -  person user3201185    schedule 29.01.2014
comment
Я попробовал ваш код (в Vista) и получил ошибку 123, жалуясь на неправильное имя файла (с косой чертой). Возможно, другие версии Python/Windows вместо этого будут выдавать вышеуказанную ошибку.   -  person Lennart Regebro    schedule 29.01.2014
comment
Осторожнее с этими обратными косыми чертами. \f – это подача формы. \a шумит.   -  person user2357112 supports Monica    schedule 29.01.2014
comment
@ user2357112: Принято к сведению, спасибо.   -  person user3201185    schedule 29.01.2014


Ответы (2)


Возникла проблема с Shutil в jython, см. http://bugs.jython.org/issue1872

Однако это не должно быть вашей проблемой?

У вас есть косая черта в вашем пути (/), это не может быть хорошо. Чтобы ваша программа заработала, сделайте следующее.

folderPath = 'C:\Program Files (x86)\Program\folder/' + folderName
if not os.path.exists(folderPath):
    try:
        shutil.copytree('C:\Program Files (x86)\Program\folder\anotherfolder', folderPath)
    except Exception, exc:
        print exc

Это уловит возникшую ошибку. Если это произойдет снова, вы сможете получить более подробную информацию об ошибке.

Вы также можете использовать:

folderPath = 'C:\Program Files (x86)\Program\folder/' + folderName
if not os.path.exists(folderPath):
    try:
        shutil.copytree('C:\Program Files (x86)\Program\folder\anotherfolder', folderPath)
    except Exception:
        import traceback
        traceback.print_exc()

Изменить: имейте в виду, что ваша проблема все еще существует! Исключение/ошибка перехватывается в предложении exclude, поэтому программа не аварийно завершает работу. См. комментарии и ответ Лаура Ивана. Эта ошибка возникает из-за того, что у вас нет прав доступа для выполнения каких-либо действий в каталоге Program Files.

Надеюсь, это поможет. Привет, Сын

person Xeun    schedule 29.01.2014
comment
также см. комментарий @mgilson и используйте распечатку кода ошибки. - person Xeun; 29.01.2014
comment
вот почему вы должны показать нам трассировку, которая должна быть напечатана в командной строке с примером выше. В jython была проблема с обновлением atime и mtime. См. bugs.jython.org/msg7033. Однако вы все еще не используете jython, не так ли? - person Xeun; 29.01.2014
comment
ИМХО, это только изящно перехватывает исключение; основная проблема все еще существует. - person Laur Ivan; 29.01.2014
comment
Вот почему я хотел получить более подробную информацию. Конечно проблема осталась - person Xeun; 29.01.2014

Копаем еще немного:

Согласно Microsoft , errno 5 соответствует отказу в доступе.

copytree использует copy2(), который копирует файл, а затем меняет его разрешения, раз.

ИМХО, у вас нет прав на изменение (или извлечение) атрибутов файла, поэтому вы получаете файл с любыми атрибутами, которые у вас есть (ваш пользователь, группа...).

ХТН

person Laur Ivan    schedule 29.01.2014
comment
+1 за этот ответ. Доступ запрещен на компьютере с Windows в каталоге Program Files ... упускал из виду это. - person Xeun; 29.01.2014
comment
Я уверен, что оригинальный плакат знает об этом, но папки Windows C:\\Program Files и C:\\Program Files (x86) имеют ограниченный доступ во всех современных версиях Windows. Они должны работать с повышенными разрешениями, иначе будут происходить странные вещи. - person Duncan; 29.01.2014
comment
@Duncan: правда, но тот факт, что copytree тоже пытается копировать атрибуты, не совсем очевиден :). - person Laur Ivan; 29.01.2014