Запуск системной команды в скрипте Python

Я изучал синтаксис, методы и т. Д.

Я только что начал с простого скрипта резервного копирования (прямо из книги):

#!/usr/bin/python

# Filename: backup_ver1.py

import os

import time

# 1. The files and directories to be backed up are specified in a list.
source = ['"C:\\My Documents"', 'C:\\Code']

# Notice we had to use double quotes inside the string for names with spaces in it.
# 2. The backup must be stored in a main backup directory
target_dir = 'E:\\Backup' # Remember to change this to what you will be using

# 3. The files are backed up into a zip file.
# 4. The name of the zip archive is the current date and time
target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'


# 5. We use the zip command to put the files in a zip archive
zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))


# Run the backup

if os.system(zip_command) == 0:
    print('Successful backup to', target)
else:
    print('Backup FAILED')

Да, это не удается. Если я запускаю команду zip в терминале, она работает нормально. Я думаю, что это терпит неудачу, потому что zip_commandникогда не запускается. И я не знаю, как его запустить.

Просто печатать zip_commandне работает. (Я использую Python 3.1)

10.11.2009 20:28:58
Пожалуйста, не забудьте отформатировать ваш исходный код.
Jonathan Feinberg 10.11.2009 20:30:54
Пожалуйста, примите хеш перед жирным шрифтом. Извините
user208142 10.11.2009 20:32:13
Я еще не знаю форматирование ...
user208142 10.11.2009 20:32:46
Я вижу, вы добавили вкладки, спасибо.
user208142 10.11.2009 20:34:38
If I run the zip command-> Какую именно команду вы вводите, это zip -qr E:\Backup\test.zip "C:\My Documents" C:\\Code? Или просто zip( реальный вопрос: существуют ли эти каталоги в вашей системе )? Также, пожалуйста, укажите, на какой ОС вы работаете, предположительно Windows, но я бы предпочел быть уверенным.
RedGlyph 10.11.2009 20:45:35
4 ОТВЕТА

Это помогло бы нам, если бы вы могли отформатировать свой код как код; выберите части кода и нажмите кнопку «Пример кода» на панели инструментов редактора. Значок выглядит как «101/010», и если навести на него указатель мыши, в желтой рамке «подсказка» появится надпись «Пример кода <pre> </ pre> Ctrl + K».

Я только что попробовал, и если вы вставите код в редактор StackOverflow, строки с '#' будут выделены жирным шрифтом. Так что жирные линии - это комментарии. Все идет нормально.

Ваши строки содержат символы обратной косой черты. Вам нужно будет удваивать каждый обратный слеш, вот так:

target_dir = 'E:\\Backup'

Это потому, что Python обрабатывает обратную косую черту специально. Он вводит «обратную косую черту», ​​которая позволяет поместить кавычку в строку в кавычках:

single_quote = '\''

Вы также можете использовать Python «необработанную строку», которая имеет гораздо более простые правила для обратной косой черты. Необработанная строка вводится r"или r'и заканчивается "или 'соответственно. Примеры:

# both of these are legal
target_dir = r"E:\Backup"
target_dir = r'E:\Backup'
1
10.11.2009 20:39:52
Ну, я добавил косые черты, и это не имело никакого значения.
user208142 10.11.2009 20:46:23
Позвольте мне процитировать книгу: Затем мы наконец запускаем команду, используя функцию os.system, которая запускает команду, как если бы она была запущена из системы, т.е. в оболочке - она ​​возвращает 0, если команда была выполнена успешно, иначе она возвращает ошибку число.
user208142 10.11.2009 20:56:56

Вы уверены, что скрипт Python видит ту же среду, к которой у вас есть доступ, когда вы вводите команду вручную в оболочке? Возможно, что zip не на пути, когда Python запускает команду.

1
10.11.2009 20:39:18
Насколько я вижу, они на том же пути.
user208142 10.11.2009 20:46:57

Следующим шагом, который я рекомендую, является изменение вашего сценария для печати строки команды, и просто посмотрите на строку и посмотрите, кажется ли она правильной.

Другая вещь, которую вы можете попробовать, - это создать командный файл, который распечатывает переменные среды, и запустить Python, и посмотреть, как выглядит среда. Особенно ПУТЬ.

Вот предложенный пример:

set
echo Trying to run zip...
zip

Поместите их в пакетный файл с именем C:\mytest.cmd, а затем запустите ваш код Python:

result_code = os.system("C:\\mytest.cmd")
print('Result of running mytest was code', result_code)

Если это сработает, вы увидите распечатанные переменные окружения, затем будет выведено «Попытка запустить zip ...», затем, если zip запустится, он напечатает сообщение с номером версии zip и тем, как его запустить.

0
10.11.2009 21:42:50
Я уже сделал первую часть, и она работает. Так что zip_command работает. Я не знаю, как сделать вторую часть, хотя.
user208142 10.11.2009 21:23:40
Что ты не понимаешь во второй части? Здесь я сформулирую это по-другому: запустите Блокнот Windows и скопируйте строки «предлагаемого примера» (set, echo и zip, приведенные выше) и вставьте их в Блокнот. Сохранить как файл "C: \ mytest.cmd". Затем запустите показанный код Python: result_code = os.systemи остальное.
steveha 10.11.2009 21:45:26

Команда zip работает только в Linux, а не для Windows .., поэтому она делает ошибку ..

0
9.01.2010 12:54:14