отказано в разрешении на каталог «/ Library» на Mac — Python3

#python #directory #paste #shutil

#python #аутентификация #каталог #Копировать #паста

Вопрос:

Я пытаюсь создать программу, которая копирует каталог в каталог библиотеки на Mac (путь: «/ Library»). Я использую shutil, который очень хорошо работает в других каталогах, но не в каталоге библиотеки…

Я хочу иметь возможность скомпилировать свою программу, поэтому я не могу запустить ее от имени root.

Вот мой код :

 import shutil

def copy(src_path, dir_path):
    try:
        shutil.copytree(src_path, dir_path)
        print("Success!")
    except:
        print("Impossible to copy the folder...")
        print("Failed!")

copy("/Users/marinnagy/Desktop/Test", "Library/Test")
 

Я думаю, это потому, что каталог библиотеки защищен и требует аутентификации для внесения изменений.
Должен ли я отправлять запрос на аутентификацию пользователю? Или мне нужно использовать другой метод, кроме shutil?

Спасибо за вашу помощь!

Комментарии:

1. Вы пробовали запускать его от имени root ?

2. С помощью команды sudo? Нет, я этого не делал, но я хочу иметь возможность скомпилировать программу с помощью pyinstaller, так что это не лучшее решение для меня…

Ответ №1:

После долгих исследований и множества попыток мне наконец удалось скопировать папку в каталог моей библиотеки.

В macOS процесс записи в защищенный каталог, такой как каталог библиотеки, заблокирован для программы python. После компиляции (я использую pyinstaller) кажется, что приложение python не может получить доступ к такой папке, даже если вы предоставляете приложению полный доступ к диску в системных настройках.

Поэтому я использовал некоторый AppleScript для управления этой конкретной задачей копирования / вставки :

 on run {scr_path, dir_path} # Run with arguments
    # Translate standard paths to their quoted form
    set formated_scr_path to quoted form of scr_path
    set formated_dir_path to quoted form of dir_path
    # Run a simple shell script to copy the repertory in the other
    do shell script "cp -R " amp; formated_scr_path amp; space amp; formated_dir_path ¬
    with administrator privileges # Ask for administrator privileges
end run
 

Затем в моей программе на python я вызываю программу AppleScript, когда хочу скопировать / перенести в защищенный репертуар, такой как репертуар библиотеки :

 import subprocess

def copy(scr_path, dir_path):
    # Use the osascript process to call the AppleScript
    # Give the paths in arguments
    process = subprocess.call(['osascript', "path/to/applescript", 
    scr_path, dir_path])
return process

copy("path/to/folder 1", "path/to/folder 2")
 

Этот метод работал для меня в защищенных каталогах. AppleScript запускается в фоновом режиме, и появляется окно аутентификации, в котором пользователю предлагается идентифицировать себя как администратора :
скриншот результата