«Аргумент int () должен быть строкой» из int (p.returncode) с объектом subprocess.Popen - PullRequest
1 голос
/ 10 апреля 2020

Я разрабатываю Python 3 программу для резервного копирования с помощью удаленных папок rsyn c на локальное NAS.

Я rsyn c папка отлично, но когда я хочу сжать .tar.gz папка в файл я получаю эту ошибку:

int() argument must be a string, a bytes-like object or a number, not 'NoneType'
tar: Removing leading `/' from member names
file changed as we read it
tar: write error

Функция, которая генерирует сжатый файл, выглядит так:

def make_tarfile(self, output_filename, source_dir):
    try:
        # Generate .tar.gz
        print("Generating .tar.gz backup")
        tar_args = ['tar', '-cvzf', source_dir+output_filename+'.tar.gz', source_dir]
        process = subprocess.Popen(
                tar_args,
                stdout=subprocess.PIPE
            )
        if int(process.returncode) != 0:
            print('Command failed. Return code : {}'.format(process.returncode))
        print("OK.")

        # Remove files
        print("Removing files previously compressed.")
        remove_args = ['find', source_dir, '-type f', '!', '-name "*.?*"', '-delete']
        process = subprocess.Popen(
                remove_args,
                stdout=subprocess.PIPE
            )
        print("OK.")
        if int(process.returncode) != 0:
            print('Command failed. Return code : {}'.format(process.returncode))
    except Exception as e:
        print(e)
        exit(1)

Если я пишу команду с помощью bash, кажется, работа.

1 Ответ

1 голос
/ 10 апреля 2020

Создание нового subprocess.Popen объекта запускает процесс. Он не ждет, пока он завершится sh, и для незавершенного процесса не существует returncode.

Исторический способ дождаться завершения объекта Popen sh - это вызвать wait() функция на нем. Вместо этого вы также можете использовать subprocess.run или другого помощника, такого как communicate(), который сам неявно ожидает завершения.

...