2012-02-03 6 views
3

Я пытаюсь получить базовое представление о том, как модуль os.system может использоваться для выполнения команд 7zip. На данный момент я не хочу усложнять работу с помощью Popen или подпроцесса. Я установил 7zip и скопировал файл 7zip.exe в папку моих пользователей. Я просто хочу извлечь файл test.zip. Однако, используя приведенный ниже код, оболочка должна появиться кратковременно перед выходом и без распаковки. Пожалуйста, не могли бы вы сказать мне, почему?как выполнить команды 7zip из сценария python

def main(): 
    try: 

     os.system(r"C:\Users\Oulton\ 7z e C:\Users\Oulton\install.zip") 
    except: 
      time.sleep(3) 
      traceback.print_exc 

if __name__ == "__main__": 
    main() 

Большое спасибо

+0

Шаг 1. Формат кода в вашем вопросе правильно. Шаг 2. Прочитайте модуль 'subprocess'. Шаг 3. Измените свой вопрос, чтобы использовать 'subprocess' вместо' os.system', пожалуйста. –

+0

Да, я прочитаю на subprocess спасибо –

ответ

7

Есть несколько проблем, с помощью следующей строки:

os.system("C:\Users\Oulton\ 7z e C:\Users\Oulton\install.zip ") 

Поскольку ваша строка содержит обратную косую черту, вы должны использовать :

os.system(r"C:\Users\Oulton\7z -e C:\Users\Oulton\install.zip") 

(примечание r перед первой двойной цитатой.)

Я также удалил посторонние пробелы. Первый (до 7z) был определенно проблематичным.

Также обратите внимание, что функция traceback.print_exc не вызывает функцию. Вам нужно добавить круглые скобки: traceback.print_exc().

И, наконец, в новом коде рекомендуется, чтобы subprocess был used in preference to os.system().

+1

спасибо Я пробовал, что он все еще не работает, хотя –

+0

@AlexOulton: Пробовал также удалить пробелы? – NPE

+0

Большое спасибо за помощь! –

1

Может быть сделано с помощью подмодуль процесса:

import subprocess 

beforezip = D:\kr\file       #full location 
afterzip = filename.zip 
Unzipped_file = "7z a \"%s\" \"%s\"" %(afterzip, beforezip) 
retV = subprocess.Popen(cmdExtractISO, shell=True, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT) 
outData = retV.stdout.readlines();