如何将这个tar命令作为参数传递给python子进程

2024-04-26 17:18:55 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在终端上运行args中指定的命令,那么它在终端上运行成功,但在python程序中执行相同的操作不起作用;我在屏幕上看到与输入tar文件大小相当的垃圾字符和大量xterm单词

我觉得问题是如何处理args中的“”字母

 import subprocess

 try:
     args = "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz".split()
     subprocess.check_call(args)
 except subprocess.CalledProcessError as e:
     print e

Tags: import命令程序终端屏幕字母argstar
2条回答

我尝试了很多选择,但没有一个是令人满意的。我发现最好的方法是切换到Popen。你知道吗

# this should have the a similar signature to check_call 
def run_in_shell(*args):
    # unfortunately, `args` won't be escaped as it is actually a string argument to bash.
    proc = subprocess.Popen(['/bin/bash', '-c', ' '.join(args)])
    # This will also work, though I have found users who had problems with it.
    # proc = subprocess.Popen(' '.join(args), shell=True, executable='/bin/bash')
    stat = proc.wait()
    if stat != 0:
        subprocess.CalledProcessError(returncode=stat, cmd=command)
    return stat

run_in_shell("cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz")

需要注意的是:/bin/sh对于未转义的括号有问题。如果不想在上面指定'/bin/bash',则需要转义paren:

args = 'cat parsing.tgz <\\(echo -n ''| gzip\\)> new-file.tgz'

我不是专家,但我发现-这个命令不是在sh中工作,而是在bash中工作:

$ sh -c "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz"
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz'
$
$ bash -c "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz"
$

这就是为什么它不能直接在子进程中工作的原因。此代码看起来工作正常:

import subprocess
command = "cat parsing.tgz <(echo -n ''| gzip)> new-file.tgz"
subprocess.Popen(command, shell=True, executable='/bin/bash')

相关问题 更多 >