#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 запускается в фоновом режиме, и появляется окно аутентификации, в котором пользователю предлагается идентифицировать себя как администратора :
скриншот результата