字符列表而不是Python中的字符串

时间:2018-10-23 20:47:53

标签: python subprocess argparse

我正在尝试使用cd '/etc/yum.repos.d/' curl 'https://copr.fedorainfracloud.org/coprs/scx/fusecompress/repo/epel-7/scx-fusecompress-epel-7.repo' > 'scx-fusecompress-epel-7.repo' yum install -y 'fusecompress' 运行命令,但是从输出中看来,我提供的参数不是解释为字符串,而是解释为字符列表。 我正在尝试运行的命令:subprocess.check_call()。 实际运行的是什么:

7z x test.rar返回了非零退出状态2。

由于某种原因,文件名用字符分隔。我想念什么?

代码:

subprocess.CalledProcessError: Command '['7z', 'x', 't', 'e', 's', 't', '.', 'r', 'a', 'r']

2 个答案:

答案 0 :(得分:0)

有关列表和字符串的文档非常准确地涵盖了这一点。 extend将新元素放入列表,然后从包含单个字符串的列表开始。您从未使用过字符串串联运算符。试试这个,代替:

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

注意:由于file是内置类型,因此我更改了参数。

答案 1 :(得分:0)

您可以在此处执行两种方法:

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

或者如果您不太担心shell注入并且这是本地代码,则只需传递整个字符串即可:

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

其他人已经了解了为什么您在列表中看到“字符”。扩展将 listify 您的字符串(在这种情况下为file_name)并将其添加到列表的末尾。

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

输出:

[11, 'a', 'p', 'p', 'l', 'e', 's']