Список символов вместо строки в Python - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь запустить команду, используя subprocess.check_call(), но из вывода видно, что параметры, которые я даю, интерпретируются не как строка, а как список символов.Команда, которую я пытаюсь выполнить: 7z x test.rar.Что на самом деле работает:

subprocess.CalledProcessError: Command '['7z', 'x', 't', 'e', 's', 't', '.', 'r', 'a', 'r'] вернул ненулевой статус выхода 2.

Почему-то имя файла разделено символами.Чего мне не хватает?

Код:

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("input", help="File/Folder to extract")
    args = parser.parse_args()
    extract_file(args.input)

def extract_file(file):
    extract_cmd = ['7z']
    extract_cmd.extend('x')
    extract_cmd.extend(file)
    subprocess.check_call(extract_cmd)

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Здесь вы можете сделать два подхода:

subprocess.check_call(['7z', 'x', file])

или если вы не слишком беспокоитесь о внедрении оболочки и это локальный код, просто передайте всю строку:

subprocess.check_call('{} {} {}'.format('7z', 'x', file), shell=True)

Другие уже дали понять, почему вы видите "символы" в вашем списке.расширение listify вашей строки (в данном случае имя_файла) и добавит ее в конец списка.

a = [11]
a.extend('apples')
print a

вывод:

[11, 'a', 'p', 'p', 'l', 'e', 's']
0 голосов
/ 23 октября 2018

Документация для списков и строк охватывает это довольно точно.extend помещает новые элементы в список, и вы начали со списка, содержащего одну строку.Вы никогда не использовали оператор конкатенации строк.Попробуйте вместо этого:

def extract_file(file_name):
    extract_cmd = ["7z x " + file_name]
    subprocess.check_call(extract_cmd)

Примечание. Я изменил ваш параметр, поскольку file является встроенным типом.

...