Форум сайта python.su
Добрый день!
Вопрос, наверное, не совсем по Python, но все же. Не могу понять почему оно работает:
import os import time source = [r'"Q:\Test 1"', r'"Q:\Test 2"'] # каталоги, которые архивируем target_dir = r'Q:\BackUpPython' # путь бэкапа target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.rar' # обзываем архив # Не понимаю следующую строку rar_command = '""d:\Program Files\WinRAR\winrar.exe" a -r {0} {1}'.format(target, ' '.join(source)) print(rar_command) # вывод передаваемой строки (для себя) if os.system(rar_command) == 0: # запускаем команду из системы print('Резервная копия успешно создана в', target) else: print('Создание резервной копии НЕ УДАЛОСЬ')
Отредактировано Roiser (Апрель 26, 2020 00:38:30)
Офлайн
Сразу добавлю еще вопрос:
Пришлось явно указывать путь к архиватору в rar_command, т.к. если написать winrar или winrar.exe - пишет ошибку, что оно не является внутренней или внешней командой, хотя путь в переменную Path добавил и из командной строки винды значение rar_command выполняется. Куда дальше копать?
Офлайн
Сначала сделай код, в котором есть только os.system() и в эту функцию напрямую передаётся строка, без использования переменных. И когда архивирование работает, тогда и можешь этот код менять, вынося части строки в переменные.
Используй команду winrar без пути. Если не работает, настрой всё сначала, чтобы работало.
Отредактировано py.user.next (Апрель 26, 2020 04:18:15)
Офлайн
RoiserА у меня с двойными кавычками не выполняется. => пути командной строки windows неисповедимы. Лично я НИЧЕГО не ставлю в папки содержащие в имени пробелы или не латинскими буквами в винде, поскольку рано или поздно получишь по мозгам. Подозреваю вы запускаете один скрипт а смотрите другой.
А если убрать одни двойные кавычки в начале
RoiserНаписать как вы запускаете скрипт, от какого пользователя. В скрипте напечатать os.environ “path”.
хотя путь в переменную Path добавил и из командной строки винды значение rar_command выполняется. Куда дальше копать?
Отредактировано doza_and (Апрель 26, 2020 09:48:47)
Офлайн
py.user.next
Сначала сделай код, в котором есть только os.system() и в эту функцию напрямую передаётся строка, без использования переменных.
Используй команду winrar без пути.
Написать как вы запускаете скрипт, от какого пользователя.
Отредактировано Roiser (Апрель 26, 2020 13:35:29)
Офлайн
Могу предположить, что первая двойная кавычка - это ко всей строке “архиватор ключи параметр1 параметр2”, а втрорая двойная к строке “путь_к_архиватору\архиватор”. Больше не до чего существенного не могу додуматься. Прав doza_and в части неисповедимости пути командной строки венды: она - это такая муть…
Офлайн
Доброго времени суток, уважаемые форумчане. Я пошарился по разным темам, но более подходящего места для своего вопроса не нашел.
В общем код из книги Byte of Python, тема Метаклассы. Я набрал код, но он полностью не выполняется. Проверил на несколько раз, ошибку найти не могу. Уповаю на вас
from abc import * class SchoolMember(metaclass=ABCMeta): '''Представляет любого человека в школе.''' def __init__(self, name, age): self.name = name self.age = age print('(Создан SchoolMember: {0})'.format(self.name)) @abstractmethod def tell(self): '''Вывести информацию.''' print('Имя: "{0}" Возраст: "{1}"'. Format(self.name, self.age), emd = " ") class Teacher(SchoolMember): '''ПРедставляет преподавателя.''' def __init__(self, name, age, salary): SchoolMember.__init__(self, name, age) self.salary = salary print('(Создан Teacher: {0})'.format(self.name)) def tell(self): SchoolMember.tell(self) print('Зарплата: "{0:d}"'.format(self.salary)) class Student(SchoolMember): '''Представляет студента.''' def __init__(self, name, age, marks): SchoolMember.__init__(self, name, age) self.marks = marks print('(Создан студент: {0})'.format(self.name)) def tell(self): SchoolMember.tell(self) print('Оценки: "{0:d}"'.format(self.marks)) t = Teacher('Mrs. Shrividya', 40, 30000) s = Student('Swaroop', 25, 75) # m = SchoolMember('abc', 10) # Это приведёт к ошибке: "TypeError: Can't instantiate abstract class # SchoolMember with abstract methods tell" print() # печатает пустую строку members = [t, s] for member in members: member.tell() # Работает, как для преподователя, так и для студента
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-19-5876c9838b12> in <module> 58 members = [t, s] 59 for member in members: ---> 60 member.tell() # Работает, как для преподователя, так и для студента <ipython-input-19-5876c9838b12> in tell(self) 33 34 def tell(self): ---> 35 SchoolMember.tell(self) 36 print('Зарплата: "{0:d}"'.format(self.salary)) 37 <ipython-input-19-5876c9838b12> in tell(self) 23 def tell(self): 24 '''Вывести информацию.''' ---> 25 print('Имя: "{0}" Возраст: "{1}"'. Format(self.name, self.age), emd = " ") 26 27 class Teacher(SchoolMember): AttributeError: 'str' object has no attribute 'Format'
Офлайн
Привет! В классе SchoolMember в методе tell у тебя метод .format с заглавной написан.
И дальше смотри…emd
print('Имя: “{0}” Возраст: “{1}”'. Format(self.name, self.age), emd = “ ”)
Отредактировано Roiser (Май 12, 2020 04:03:36)
Офлайн
RoiserПримного благодарен. Хорошего дня!
Roiser
Офлайн