Shutil.move(scr, dst) выдает ошибку IOError: [Errno 13] Отказано в доступе и еще 3 ошибки

Documents = ['*pdf', '*docx', '*txt']

for i in range(len(Documents)):
    if glob.glob(Documents[i]):
        print(Documents[i], True)
        shutil.move(glob.glob(Documents[i])[0], '/home')

    else:
        print(Documents[i], False)

Ну, все идет отлично, пока:

shutil.move(glob.glob(Documents[i])[0], '/home')

Что в основном:

shutil.move(scr, dst)

И выдает ошибку:

*pdf False
*docx True
Traceback (most recent call last):
  File "/usr/lib/python3.2/shutil.py", line 326, in move
    os.rename(src, real_dst)
OSError: [Errno 13] Permission denied

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "teste.py", line 19, in <module>
    shutil.move(glob.glob(Documents[i])[0], '/home')
  File "/usr/lib/python3.2/shutil.py", line 334, in move
    copy2(src, real_dst)
  File "/usr/lib/python3.2/shutil.py", line 146, in copy2
    copyfile(src, dst)
  File "/usr/lib/python3.2/shutil.py", line 99, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/home/jesus.docx'

Я пытался использовать абсолютный путь как в scr, так и в dst, но это не сработало. Я просмотрел Интернет и обнаружил, что это может иметь какое-то отношение к разрешениям, но если мне придется изменить разрешения, это нарушит цель сценария, и поэтому я попытаюсь найти помощь здесь, прежде чем переходить к разрешению. вещь.

Итак, что мне делать?

Моя цель - переместить файлы в каталоги пользователей Linux. (отсортируйте их по формату файла..)... ex-> .jpg --> Картинки, .pdf --> Документы и так далее. (Вот почему у меня не может быть разрешения на то, что ожесточает жизнь...)

Кроме того, я новичок в программировании (просто чтобы вы, ребята, не слишком заморачивались :D). И это также мои первые вопросы здесь, в этом сообществе, так что, пожалуйста, немного терпения, если я кажусь потерянным или повторяющимся? Спасибо


person Joao Guedes    schedule 23.04.2014    source источник


Ответы (2)


Вы пытаетесь записать файлы в каталог /home. Вы не должны этого делать.

Linux — многопользовательская операционная система. /home — это место, где живут все домашние каталоги ваших пользователей. У каждого пользователя должен быть свой собственный каталог под /home. Например, у вас может быть /home/Joao.

Измените последний параметр из этой строки

shutil.move(glob.glob(Documents[i])[0], '/home')

to

shutil.move(glob.glob(Documents[i])[0], '/home/your_username')

Вот общее предложение по улучшению:

# Variable names are lower case
documents = ["*.pdf", "*.docx", "*.txt"] 
# You iterate over a for loop like this. Python's for is like for-each. You get the actual item.
for doc in documents: 
    if glob.glob(doc):
        shutil.move(glob.glob(doc)[0], '/home/your_username/Documents')
person msvalkon    schedule 23.04.2014
comment
Просто хотел добавить дополнительную благодарность за ваш дополнительный намек на вещь. - person Joao Guedes; 23.04.2014

Вы хотите, чтобы пользователи, запускающие ваш скрипт, могли запускать его с повышенными привилегиями. Есть что-то, называемое битом setuid (установить идентификатор пользователя), который, если он установлен, запустит скрипт с привилегиями владельца. Также есть бит setgid (установить идентификатор группы).

Чтобы установить их, станьте root и выполните:

chown root scriptname
chmod ug+s scriptname

Это устанавливает как бит setuid, так и бит setgid.

http://en.wikipedia.org/wiki/Setuid

person ooga    schedule 23.04.2014