Найти - Пользователи
Полная версия: Задача из Byte of Python про BackUp
Начало » Python для новичков » Задача из Byte of Python про BackUp
1
Roiser
Добрый день!
Вопрос, наверное, не совсем по 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('Создание резервной копии НЕ УДАЛОСЬ')

А именно, не могу понять почему работает с (' “ ”) таким количеством кавычек перед путем к архиватору.
В rar_command передается “”d:\Program Files\WinRAR\winrar.exe“ a -r Q:\BackUpPython\20200426002110.rar ”Q:\Test 1“ ”Q:\Test 2“
А если убрать одни двойные кавычки в начале, строка вроде нормальная становится, но выдает ошибку:
”d:\Program" ��… Видимо, он, несмотря на команду в двойных кавычках, берет только кусок до пробела, поэтому я и поставил в начале строки еще одни, но не понял сам принцип. Одни двойные кавычки не закрытые получаются…
Roiser
Сразу добавлю еще вопрос:
Пришлось явно указывать путь к архиватору в rar_command, т.к. если написать winrar или winrar.exe - пишет ошибку, что оно не является внутренней или внешней командой, хотя путь в переменную Path добавил и из командной строки винды значение rar_command выполняется. Куда дальше копать?
py.user.next
Сначала сделай код, в котором есть только os.system() и в эту функцию напрямую передаётся строка, без использования переменных. И когда архивирование работает, тогда и можешь этот код менять, вынося части строки в переменные.

Используй команду winrar без пути. Если не работает, настрой всё сначала, чтобы работало.
doza_and
Roiser
А если убрать одни двойные кавычки в начале
А у меня с двойными кавычками не выполняется. => пути командной строки windows неисповедимы. Лично я НИЧЕГО не ставлю в папки содержащие в имени пробелы или не латинскими буквами в винде, поскольку рано или поздно получишь по мозгам. Подозреваю вы запускаете один скрипт а смотрите другой.

Как правильно пишет py.user.next желательно чтобы утилиты вызывались без указания полного пути.

Roiser
хотя путь в переменную Path добавил и из командной строки винды значение rar_command выполняется. Куда дальше копать?
Написать как вы запускаете скрипт, от какого пользователя. В скрипте напечатать os.environ “path”.

Лично мне сильно помогает если пользоваться в windows far. Решает кучу проблем с тем что запускается где от какого пользователя, в каком окружении, с какими аргументами командной строки, какие расширения у файлов тчто выдается на консоль итд итп.
Roiser
py.user.next
Сначала сделай код, в котором есть только os.system() и в эту функцию напрямую передаётся строка, без использования переменных.
Используй команду winrar без пути.

Сделал. Работает. Поставил вместо пути к архиватору - “winrar” - тоже выполняется Оо.

Вернул взад rar_command = ‘winrar a -r {0} {1}’.format(target, ‘ ’.join(source)) … Теперь тоже работает…чудеса.
Но работает и так ( ‘ " )winrar a -r {0} {1}’.format(target, ‘ ’.join(source)), интересно, почему? Может это какая-то особенность Pycharm?

Написать как вы запускаете скрипт, от какого пользователя.

Напечатал os.environ - пользователь админ, путь к winrar на месте.


Всем спасибо! Работает так, как надо, хотя и не до конца понял почему раньше не работало - изначально rar_command был именно таким (даже комп не перезагружал). Если есть идеи по поводу кавычек - напишите, интересно разобраться для общего развития.
Rafik
Могу предположить, что первая двойная кавычка - это ко всей строке “архиватор ключи параметр1 параметр2”, а втрорая двойная к строке “путь_к_архиватору\архиватор”. Больше не до чего существенного не могу додуматься. Прав doza_and в части неисповедимости пути командной строки венды: она - это такая муть…
orB
Доброго времени суток, уважаемые форумчане. Я пошарился по разным темам, но более подходящего места для своего вопроса не нашел.
В общем код из книги 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() # Работает, как для преподователя, так и для студента

Код выдает только:
(Создан SchoolMember: Mrs. Shrividya)
(Создан Teacher: Mrs. Shrividya)
(Создан SchoolMember: Swaroop)
(Создан студент: Swaroop)

А дальше ошибка:

 ---------------------------------------------------------------------------
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'

А по книге, должен еще дописать:
Имя:“Mrs. Shrividya” Возраст:“40” Зарплата: “30000”
Имя:“Swaroop” Возраст:“25” Оценки: “75”

Прошу прощения, если не правильно оформил вопрос, готов выслушать и взять на вооружение все замечания. Благодарю, всем удачи!


Roiser
Привет! В классе SchoolMember в методе tell у тебя метод .format с заглавной написан.
И дальше смотри…emd
print('Имя: “{0}” Возраст: “{1}”'. Format(self.name, self.age), emd = “ ”)
orB
Roiser
Roiser
Примного благодарен. Хорошего дня!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB