如何使用bash使我的Python脚本工作?

时间:2015-02-26 00:34:35

标签: python linux bash shell scripting

我是这个网站的新手,所以希望这是提出这个问题的正确位置。

我正在尝试使用python for Linux编写脚本:

  1. 创建文件file.txt
  2. 'lsof'命令的输出附加到file.txt
  3. 读取输出的每一行并将它们附加到数组中。
  4. 然后打印每一行。
  5. 我基本上只是为了熟悉使用python for bash,我是这个领域的新手,所以任何帮助都会很棒。我不知道从哪里开始。此外,如果有更好的方法,我会对此持开放态度!

    #!/usr/bin/env python
    import subprocess
    
    touch = "touch file.txt"
    subprocess.call(touch, shell=True)
    xfile = "file.txt"
    
    connection_count = "lsof -i tcp | grep ESTABLISHED | wc -l"
    count = subprocess.call(connection_count, shell=True)
    
    if count > 0:
        connection_lines = "lsof -i tcp | grep ESTABLISHED >> file.txt"
    
    subprocess.call(connection_lines, shell=True)
    
    with open(subprocess.call(xfile, shell=True), "r") as ins:
        array = []
        for line in ins:
            array.append(line)
    
    for i in array:
        print i
    

1 个答案:

答案 0 :(得分:2)

subprocess.call返回已启动进程的返回码(bash中为$?)。这几乎肯定不是你想要的 - 并解释了为什么这条线几乎肯定会失败:

with open(subprocess.call(xfile, shell=True), "r") as ins:

(你不能打开一个号码)。

可能您希望将subprocess.Popenstdout=subprocess.PIPE一起使用。然后你可以读取管道的输出。例如要得到计数,你可能想要这样的东西:

connection_count = "lsof -i tcp | grep ESTABLISHED"
proc = subprocess.POPEN(connection_count, shell=True, stdout=subprocess.PIPE)
# line counting moved to python :-)
count = sum(1 for unused_line in proc.stdout)

(你也可以在这里使用Popen.communicate

请注意,过度使用shell=True对我来说总是有点可怕......如documentation所示,将管道链接起来要好得多。