os.system不允许使用>命令

时间:2017-06-11 14:49:27

标签: python

我可以在linux中使用以下命令。

ls > >(tee -a a)

但是python os.system不允许使用语法。

>>> import os
>>> os.system("ls > >(tee -a a)") sh: -c: line 0: syntax error near unexpected token `>' sh: -c: line 0: `ls > >(tee -a)' 256
>>>

我们是否需要任何特殊方法来逃避任何角色?

2 个答案:

答案 0 :(得分:2)

在评论中提到,os.system使用/bin/sh运行命令。即使这是/bin/bash的链接,当Bash作为/bin/sh运行时,它也会切换到符合POSIX的模式,其中Bash特定的语法(如您正在运行的命令)不会#&# 39;工作。

一种解决方案是使用:

os.system("/bin/bash -c 'ls > >(tee -a a)'")

这非常重要 - 它使用shell /bin/sh运行新的shell /bin/bash来运行所需的命令。如果你真的想这样做,使用包subprocess中的函数来直接运行Bash会更干净。

在这种情况下,我认为这是一个更简单的解决方案。 "管道"语法:

os.system("ls | tee -a a")

/bin/sh兼容的,我认为它会达到你想要做的一样。

正如另一条评论所指出的那样,在纯Python中做这件事并不难:

# Python 3
with open("a", "a") as o:
    for f in os.listdir("."):
        print(f)
        print(f, file=o)

# Python 2
with open("a", "a") as o:
    for f in os.listdir("."):
        print f
        print >>o, f

答案 1 :(得分:1)

os.system将被subprocess取代。这是subprocess.Popen

的解决方案
import subprocess
process = subprocess.Popen("ls", stdout=subprocess.PIPE)
stdoutdata, _ = process.communicate()
print stdoutdata
with open ("a", "a") as fle:
    fle.write(stdoutdata)